http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4108
题意:
给你经典的Fibonacci 数列,给你左右区间,区间和为奇输出1,为偶数输出0;
数据范围为10的10000次方。
首先说复杂度很高,这种题就打表找规律。
其次数据范围过大,开long long也不够,可以考虑用字符数组来解决。存每一位数,求出区间和。
技巧:对于大数计算,我们可以加每一位再然后%3;
比如123456=(1+2+3+4+5+6)%3;
打表找规律会发现两个奇数,一个偶数。
考虑所有偶数的情况:
奇奇偶 奇奇偶 奇奇偶 奇奇偶
3个为循环节,根据这个找出偶数的规律。
(区间长度+1)%3= =0的话,肯定为偶数
(区间长度+1)%3= =1的话,如果左区间%3==0,为偶数
(区间长度+1) %3= =2的话,如果左区间%3= =1,为偶数
循环节完毕,其余全是奇数情况。
f1=1 ,f2=1,f3=2,f4=3,f5=5,f6=8,f7=13,f8=21,f9=34,f10=55;…
6
1 2
1 3
1 4
1 5
123456 12345678987654321
123 20190427201904272019042720190427
Sample Output
0
0
1
0
0
1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=3e5+10;
char c1[maxn];
char c2[maxn];
int cnt1[maxn];//把字符转换数字,放在数组;
int cnt2[maxn];
int main(){
int t;
cin>>t;
while(t--){
cin>>c1>>c2;
int len1=strlen(c1);
int len2=strlen(c2);
int sum1=0,sum2=0;//记录每位相加和然后%3;
for(int i=0;i<len1;i++){
cnt1[i]=c1[i]-'0';
sum1+=cnt1[i];
}
for(int i=0;i<len2;i++)
{
cnt2[i]=c2[i]-'0';
sum2+=cnt2[i];
}
sum1=sum1%3;
sum2=sum2%3;
int ans;//记录答案
if((sum2-sum1+1)%3==0)
ans=0;
else if((sum2-sum1+1)%3==1&&sum1%3==0)
ans=0;
else if((sum2-sum1+1)%3==2&&sum1%3==1)
ans=0;
else ans=1;
printf("%d\n",ans);
}
return 0;}