Sample Input
6 1 2 1 3 1 4 1 5 123456 12345678987654321 123 20190427201904272019042720190427
Sample Output
0 0 1 0 0 1
注释:这道题有规律,前12项如下(1代表奇数,0代表偶数)
下标n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
Fn | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 |
Sn | 1 | 2 | 4 | 7 | 12 | 20 | 33 | 54 | 88 | 143 | 232 | 376 |
Sn奇偶性 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
由图中可以看出前n项斐波纳契数的和呈“1 0 0”的规律,3个一循环。
a,b的位数高达10000位,所以用char乐行输入,然后转化为整型。
有一个小知识:对于一个数,它的各个位数之和能够被3整除,那么这个数就是3的倍数。
让下标从0开始很巧妙,即能被3整除的下标对应的Sn是奇数,剩下的都是偶数。即各个位数之和对3取余为0则是“ 1 0 0”的第一个数1,取余为1是是“1 0 0”的中的第二个数0,取余为2是“1 0 0”中的第三个数0。
题目要求第a个和第b个之间斐波纳契数之和是奇数还是偶数,即求前b项和-前(a-1)项的和的奇偶性。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
int main()
{
char a[10010],b[10010];
int c[3]={1,0,0};
int t;
scanf("%d",&t);
while(t--){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%s",a);
scanf("%s",b);
int aa=strlen(a);
int bb=strlen(b);
int sa=0,sb=0;
for(int i=0;i<aa;i++){
sa+=a[i]-'0';
}
for(int i=0;i<bb;i++){
sb+=b[i]-'0';
}
sa=sa-2;//前a-1项和的奇偶
sb=sb-1;//前b-1项和的奇偶
if(sa==-1){
if(c[ sb%3 ]%2==0)
printf("0\n");
else
printf("1\n");
}
else{
if(c[ sa%3 ] == c[ sb%3 ])
printf("0\n");
else
printf("1\n");
}
}
return 0;
}