题意:有一堆石子,A和B轮流从中取一定的石子,但规定:第一次不能取完,至少一个;从第二次开始,每个人取的石子数至少为1,至多为对手刚取的石子数的两倍。A先取,问A是否会胜?然后石子数不确定 给你k组数 (对b取模等于a)
#include <bits/stdc++.h>
#define ll long long
#define LL long long
using namespace std;
ll f[100]={0,1};
LL exgcd(LL a,LL b,LL &x,LL &y) {
if(b==0) {
x = 1;
y = 0;
return a;
} else {
LL r = exgcd(b,a%b,y,x);
y -= x*(a/b);
return r;
}
}
//n个方程:x=a[i](mod m[i])
LL CRT(LL *a,LL *m,int n) {
LL c = a[0], l = m[0];
LL d, x, y;
for(int i = 1; i < n; i++) {
d=exgcd(l, m[i], x, y);
if((a[i]-c)%d)
return -1;
x = (a[i] - c) / d * x % (m[i] / d);
c += l * x;
l = l / d * m[i];
c %= l;
}
return c > 0 ? c : c + l;
}
int main()
{
for(int i=2;i<100;i++)
{
f[i]=f[i-1]+f[i-2];
}
int n;
cin>>n;
ll a[110],m[110];
for(int i=0;i<n;i++)
{
cin>>m[i]>>a[i];
}
ll x=CRT(a,m,n);
if(x==-1)
{
cout<<"Tankernb!"<<endl;
return 0;
}
for(int i=1;i<99;i++)
{
if(f[i]==x)
{
cout<<"Lbnb!"<<endl;
return 0;
}
}
cout<<"Zgxnb!"<<endl;
return 0;
}