ZOJ——4108 Fibonacci in the Pocket(思维好题!!!)
原题链接: https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370503
测试样例:
Sample Input
6
1 2
1 3
1 4
1 5
123456 12345678987654321
123 20190427201904272019042720190427
Sample Output
0
0
1
0
0
1Sample Input
6
1 2
1 3
1 4
1 5
123456 12345678987654321
123 20190427201904272019042720190427
Sample Output
0
0
1
0
0
1
题意: 给你一个斐波拉契数列,要你判断从第 a a a项到第 b b b项的奇偶性。注意: 1 ≤ a ≤ b ≤ 1 0 10000 1\leq a \leq b \leq 10^{10000} 1≤a≤b≤1010000。
解题思路: 由于这道题我们并不是要计算第几项的数值,我们只是要判断奇偶性而已。那么对于奇偶性,我们就可以分析一下了,众所周知,斐波拉契数列 f 1 = f 2 = 1 f_1=f_2=1 f1=f2=1,之后的项为 f i = f i − 1 + f i − 2 ( i > 2 ) f_i=f_{i-1}+f_{i-2}(i>2) fi=fi−1+fi−2(i>2),那么我们发现之后的项数奇偶性完全由前两项决定,而前两项特殊的也都已给出,即第三项为奇+奇为偶,那么之后就是奇+偶为奇,再后面就是偶+奇为奇,再后面就又是奇+奇为偶了。这奇偶性在不断重复。用1表示奇,0表示偶,那这个规律不就是110110110·······,那么我们要求的是从第 a a a项到第 b b b项的奇偶性,这段和我们不就可以用前 b b b项减去前 ( a − 1 ) (a-1) (a−1)项来表示吗?那么这个奇偶性也同样是由它们来决定的,我们看表格分析,用 f i f_i fi表示第 i i i项的值, s i s_i si表示前 i i i项的只。
i i i | f i f_i fi | s i s_i si |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 4 |
4 | 3 | 7 |
5 | 5 | 12 |
```` |
经过这张表,我想你们也应该知道其中关系了,没错,由于数列中元素的奇偶规律也必然导致了前缀和的奇偶规律:011011011011,那么我们此题则易解,用前 b b b项减去前 ( a − 1 ) (a-1) (a−1)项来表示我们想要的结果,分析情况即可:奇-偶为奇,奇-奇为偶,偶-奇为奇,偶-偶为偶。这里还要注意的一点就是我们判断奇偶性是通过求余周期获取的,同样,由于数目过大,我们应该要用字符串存储数值,再利用变量去累加位数上的值判断余数。具体看代码。
AC代码:
/*
*邮箱:unique_powerhouse@qq.com
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include<bits/stdc++.h> //POJ不支持
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//
int t;
string sa,sb;
int cnt1,cnt2;
int main(){
//freopen("in.txt", "r", stdin);//提交的时候要注释掉
IOS;
while(cin>>t){
while(t--){
cnt1=cnt2=0;
cin>>sa>>sb;
int len1=sa.size();
rep(i,0,len1-1){
cnt1+=sa[i]-'0';
}
int len2=sb.size();
rep(i,0,len2-1){
cnt2+=sb[i]-'0';
}
//由于我们要判断中间的奇偶性。
cnt1--;
if((cnt1%3==1&&cnt2%3!=1)||(cnt1%3!=1&&cnt2%3==1))
cout<<1<<endl;
else
cout<<0<<endl;
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!