https://nanti.jisuanke.com/t/41383
解:
斐波那契博弈+中国剩余定理。
#include <bits/stdc++.h>
using namespace std;
long long a[],m[],ans;
long long exgcd(long long a,long long b,long long &x,long long &y){
if (!b)
{x=,y=;return a;}
long long re=exgcd(b,a%b,x,y),tmp=x;
x=y,y=tmp-(a/b)*y;
return re; }
long long gcd(long long x,long long y)
{
return y==?x:gcd(y,x%y);
}
long long work1(int n){
long long M=m[];
for(int i=;i<=n;i++)
{
M=M*m[i]/gcd(M,m[i]);
}
return M;
} long long work2(int n){
long long M=m[],A=a[],t,d,x,y;
int i;
for(i=;i<=n;i++){
d=exgcd(M,m[i],x,y);
if ((a[i]-A)%d)
return -;
x*=(a[i]-A)/d,t=m[i]/d,x=(x%t+t)%t;
A=M*x+A,M=M*m[i]/d;
}
return A;
}
long long fib[]; void sl(long long n)
{
int i;
for(i=;i<;i++)
if(fib[i]==n)
break;
if(i<)
printf("Lbnb!\n");
else
printf("Zgxnb!\n");
}
int main(){
int k,ct=;
scanf("%d",&k);
for(int i=;i<=k;i++)
{
scanf("%lld%lld",m+i,a+i);
if(a[i]==)
ct++;
}
long long n;
if(ct==k)
n=work1(k);
else
n=work2(k); if(n==-)
printf("Tankernb!\n");
else
{
fib[]=;fib[]=;
for(int i=;i<;i++)
{
fib[i]=fib[i-]+fib[i-];
// printf("%d %lld\n",i,fib[i]);
}
sl(n);
}
return ;
}