题目背景
天下第一的 cbw 以主席的身份在 8102 年统治全宇宙后,开始了自己休闲的生活,并邀请自己的好友每天都来和他做游戏。由于 cbw 想要显出自己平易近人,所以 zhouwc 虽然是一个蒟蒻,也有能和 cbw 玩游戏的机会。
题目描述
游戏是这样的:
给定两个数 x,y,与一个模数 p。
cbw 拥有数 x,zhouwc 拥有数 y。
第一个回合:x←(x+y)modp。
第二个回合: y←(x+y)modp。
第三个回合:x←(x+y)modp。
第四个回合: y←(x+y)modp。
以此类推....
如果 x 先到 0,则 cbw 胜利。如果 y 先到 0,则 zhouwc 胜利。如果 x,y 都不能到 0,则为平局。
cbw 为了捍卫自己主席的尊严,想要提前知道游戏的结果,并且可以趁机动点手脚,所以他希望你来告诉他结果。
输入格式
有多组数据。
第一行:T 和 p 表示一共有 T 组数据且模数都为 p。
以下 T 行,每行两个数 x,y。
输出格式
共 T 行
1 表示 cbw 获胜,2 表示 zhouwc 获胜,error
表示平局。
输入输出样例
输入 #1
1 10 1 3输出 #1
error
输入 #2
1 10 4 5输出 #2
1
说明/提示
1≤T≤200。
1≤x,y,p≤10000。
题目难度
普及/提高-
参考思路
首先,看着这个方程就想到了斐波那契数列
如果定义 x0=x , y0=y ( 初始值 )
那么就有
x=x0+y0%Mod
y=(x0+y0)+y0=x0+2y0%Mod
接着继续操作 , 就是:
x=(x0+y0)+(x0+2y0)=2x0+3y0%Mod
y=(2x0+3y0)+(x0+2y0)=3x0+5y0%Mod
x=(3x0+5y0)+(2x0+3y0)=5x0+8y0%Mod
y=(5x0+8y0)+(3x0+5y0)=8x0+13y0%Mod
...
也就是说 如果斐波那契数列mod Mod循环,那么想 x , y mod Mod也是循环的
然而易证斐波那契数列mod Mod循环
∴x , y mod Mod是循环的
所以判断 (x,y) 是会循环会原值的
至于其他,数据都不会爆int , 斐波那契数列 mod10000 的循环节也只有15000
参考代码
#include<bits/stdc++.h>
using namespace std;
int T,x,y,mod,a,b,c,n;
int main(){
cin>>T>>mod;
for(int i=1;i<=T;++i){
cin>>x>>y;
if((x+y)%mod==0){
cout<<1<<endl;
continue;
}
a=1;
b=2;
n=1;
while(a!=1||b!=1){
n++;
c=b;
b=(a+b)%mod;
a=c;
if((a*x+b*y)%mod==0){
cout<<n%2+1<<endl;
break;
}
}
if(a==1&&b==1)
cout<<"error\n";
}
}