2019银川网络赛 A (扩展中国剩余定理板子)

#include <stdio.h>
#include <iostream>
#include <queue>
#define ll long long
using namespace std;
ll exgcd(ll a, ll b, ll &x, ll &y){  
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    ll ans = exgcd(b,a%b,y,x);
    y = y - a/b*x;
    return ans;   
}
int find(ll a, ll f[144]){
	int l = 0, r = 143;
	while(l<=r){
		int mid = (l + r) >> 1;
		if(a==f[mid]) return 1;
		else if(a<f[mid]) r = mid - 1;
		else l = mid + 1; 
	}
	return 0;
}
int main(){
	int T;
	cin>>T;
	ll a,b,a1,b1,x,y;
	cin>>a>>b;	
	for(int i = 1; i < T; i++){ 
		cin>>a1>>b1;
		ll d = exgcd(a,a1,x,y);
		if((b1-b)%d){
			cout<<"Tankernb!";
			return 0;
		}
		ll t = a1 / d;
		x = (b1-b) / d * x % t;
		b += x * a;
		a = a / d * a1;
		b%=a;	
	}
	if(b<0) b+=a;
	ll fbc[150]; fbc[0] = 0; fbc[1] = 1;
	for(int i = 2; i<144; i++) fbc[i] = fbc[i-1] + fbc[i-2];	
	find(b,fbc)?cout<<"Lbnb!":cout<<"Zgxnb!"; 
	return 0;
}
发布了52 篇原创文章 · 获赞 114 · 访问量 6020

猜你喜欢

转载自blog.csdn.net/GD_ONE/article/details/100713779