唉,我又被自己坑了
这题第一次WA了,检查了一下发现当n=1000时,F(n)就变成负数了
然后把这题往高精加方向想了半天。。。
后来看到别人的结题报告,原来有规律可循(两种方法,两次AC)
第一种:
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个循环一次。
AC代码一:
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n%4==2) printf("yes\n");
else printf("no\n");
}
return 0;
}
第二种:
公式 (a+b)%c=(a%c+b%c)%c
然后 从F(0)=7 F(1)=11开始,只要看每一个数对3取余的结果就好了
设G(X) = F(X)%3
那么就有 G(0)=1,G(1)=2 G(N)=(G(N-1)+G(N-2))%3
然后把前面几项,就会看到规律 1 2 0 2 2 1 0 1 1 2 0 2 2 ……
所以是以8为周期的,然后第3项和第7项为0
AC代码二:
#include<stdio.h>
int main()
{
int n,c;
while(scanf("%d",&n)!=EOF)
{
c = n%8;
if(c==2 || c==6) printf("yes\n");
else printf("no\n");
}
return 0;
}
WA代码:
#include <cstdio>
__int64 f[1000000];
int main()
{
int n;
f[0] = 7;
f[1] = 11;
for(int i=2; i<1000000; i++)
{
f[i] = f[i-1] + f[i-2];
}
while(scanf("%d",&n)!=EOF)
{
if(n<2) printf("no\n");
else if(f[n]%3!=0)
{
printf("no\n");
//printf("%I64d\n\n", f[n]);
}
else
{
printf("yes\n");
//printf("%I64d\n\n", f[n]);
}
}
return 0;
}