题意
给出k个a,b,求出
n=b(mod a)
求出n,然后斐波那契博弈
思路
板子题
excrt
求出n然后斐波那契博弈(我只想保存一下板子,我的爆ll?).
代码
#include <iostream>
#include <map>
#define ll long long
using namespace std;
const int maxn = 1e7 + 10;
map<ll, bool> mp;
long long exgcd(long long a, long long b, long long &x, long long &y)
{
long long d = a;
if (b)
{
d = exgcd(b, a % b, y, x);
y -= x * (a / b);
}
else
{
x = 1;
y = 0;
}
return d;
}
ll r[13], m[13];
//n=bmoda;b=r,a=m
bool excrt(long long r[], long long m[], long long n, long long &re, long long &mo)
{
long long x, y;
mo = m[0];
re = r[0];
for (int i = 1; i < n; i++)
{
long long d = exgcd(mo, m[i], x, y);
if ((r[i] - re) % d != 0)
{
return 0;
}
x = (r[i] - re) / d * x % (m[i] / d);
re += x * mo;
mo = mo / d * m[i];
re %= mo;
}
re = (re + mo) % mo;
return 1;
}
ll fib[maxn];
int main()
{
fib[1] = 1;
fib[2] = 1;
for (int i = 3;; i++)
{
if (fib[i - 1] + fib[i - 2] > 1e15)
break;
fib[i] = fib[i - 1] + fib[i - 2];
mp[fib[i]] = 1;
}
int n;
while (cin >> n)
{
ll re, mo;
for (int i = 0; i < n; i++)
cin >> r[i] >> m[i];
int flag = excrt(m, r, n, re, mo);
if (flag)
cout << (mp[re] ? "Lbnb!" : "Zgxnb!") << endl;
else
cout << "Tankernb!" << endl;
}
return 0;
}