hdu 1021 Fibonacci Again   
               添加时间:2013-5-9 点击量: 
 
              
解决本题的关键:经由过程公式前提:F(0)= 7, F(1) = 11,F(n) = F(n-1) + F(n-2) (n>=2). 找到规律。
由同余式的基个性质:
(1)自反性:a = a( mod m)。
以及同余式的四则运算法例:
(1)若是 a =b( mod m)且 c = d( mod m),则 a +c = (b + d)( mod m)。
可知,F(n) = F(n) ( mod m) = ( F(n-1) +F(n-2) )( mod m)。
 
按照题目已知前提:
Print the wordyes if 3 divide evenly into F(n);Print the wordno if not.
这里m取值为3,则可将公式前提演变为:
综上所述,可获得以下对应关系:F(0)= 1, F(1) = 2, F(n) = ( F(n-1) + F(n-2)  )( mod 3) (n>=2).
index  0  1  2  3  4  5  6  7  8  9  10  11  12  13
value  1  2  0  2  2  1  0  1  1  2   0   2   2  1
print  no no yes no  no no yes  no  no  no  yes  no  no  no
如许我们就获得了如下规律:从第2个开端每隔4个轮回一次。
#include <stdio.h>
void main()
{
    int n;
    while(scanf(%d, &n) !=EOF)
    {
        if((n - 2) % 4) // 按照上述规律
           printf(no\n);
        else
           printf(yes\n);
    }
}

View Code 
#include<stdio.h> 
#include<string.h> 
long long f[1000009]; 
int main() 
{ 
int n; 
int i=2; 
memset(f,0,sizeof(f)); 
f[0]=1; 
f[1]=2; 
for(i=2;i<=1000005;i++) 
{ 
f[i]=(f[i-1]+f[i-2])%3; 
} 
while(scanf(%d,&n)==1) 
{ 
if(f[n]==0) 
{ 
printf(yes\n); 
} 
else printf(no\n); 
} 
return 0; 
} 
 
                     
                  
     
  
 
    
    
解决本题的关键:经由过程公式前提:F(0)= 7, F(1) = 11,F(n) = F(n-1) + F(n-2) (n>=2). 找到规律。
由同余式的基个性质:
(1)自反性:a = a( mod m)。
以及同余式的四则运算法例:
(1)若是 a =b( mod m)且 c = d( mod m),则 a +c = (b + d)( mod m)。
可知,F(n) = F(n) ( mod m) = ( F(n-1) +F(n-2) )( mod m)。
 
按照题目已知前提:
Print the wordyes if 3 divide evenly into F(n);Print the wordno if not.
这里m取值为3,则可将公式前提演变为:
综上所述,可获得以下对应关系:F(0)= 1, F(1) = 2, F(n) = ( F(n-1) + F(n-2)  )( mod 3) (n>=2).
index  0  1  2  3  4  5  6  7  8  9  10  11  12  13
value  1  2  0  2  2  1  0  1  1  2   0   2   2  1
print  no no yes no  no no yes  no  no  no  yes  no  no  no
如许我们就获得了如下规律:从第2个开端每隔4个轮回一次。
#include <stdio.h>
void main()
{
int n;
while(scanf(%d, &n) !=EOF)
{
if((n - 2) % 4) // 按照上述规律
printf(no\n);
else
printf(yes\n);
}
}

View Code 
#include<stdio.h>
#include<string.h>
long long f[1000009];
int main()
{
int n;
int i=2;
memset(f,0,sizeof(f));
f[0]=1;
f[1]=2;
for(i=2;i<=1000005;i++)
{
f[i]=(f[i-1]+f[i-2])%3;
}
while(scanf(%d,&n)==1)
{
if(f[n]==0)
{
printf(yes\n);
}
else printf(no\n);
}
return 0;
}




