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
1
Sample 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} 1ab1010000

解题思路: 由于这道题我们并不是要计算第几项的数值,我们只是要判断奇偶性而已。那么对于奇偶性,我们就可以分析一下了,众所周知,斐波拉契数列 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=fi1+fi2(i>2),那么我们发现之后的项数奇偶性完全由前两项决定,而前两项特殊的也都已给出,即第三项为奇+奇为偶,那么之后就是奇+偶为奇,再后面就是偶+奇为奇,再后面就又是奇+奇为偶了。这奇偶性在不断重复。用1表示奇,0表示偶,那这个规律不就是110110110·······,那么我们要求的是从第 a a a项到第 b b b项的奇偶性,这段和我们不就可以用前 b b b项减去前 ( a − 1 ) (a-1) (a1)项来表示吗?那么这个奇偶性也同样是由它们来决定的,我们看表格分析,用 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
111
212
324
437
5512
````

经过这张表,我想你们也应该知道其中关系了,没错,由于数列中元素的奇偶规律也必然导致了前缀和的奇偶规律:011011011011,那么我们此题则易解,用前 b b b项减去前 ( a − 1 ) (a-1) (a1)项来表示我们想要的结果,分析情况即可:奇-偶为奇,奇-奇为偶,偶-奇为奇,偶-偶为偶。这里还要注意的一点就是我们判断奇偶性是通过求余周期获取的,同样,由于数目过大,我们应该要用字符串存储数值,再利用变量去累加位数上的值判断余数。具体看代码。

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;
}
posted @   unique_pursuit  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示