ZOJ4108,打表找规律

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;}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值