poj C Looooops 类似青蛙的约会,拓展欧几里得算法
题目地址:http://poj.org/problem?id=2115
#include<iostream> #include<cstdio> using namespace std; typedef long long inta; void extend_gcd(inta a,inta b,inta &x,inta &y,inta &gcd) { if(b==0) { x=1; y=0; gcd=a; } else { extend_gcd(b,a%b,x,y,gcd); inta temp=x; x=y; y=temp-a/b*y; } } int main() { inta a,b,c,k,m; while(cin>>a>>b>>c>>k) { if(a==0&&b==0&&c==0&&k==0) break; m=1; m<<=k; inta A=c; inta B=m; inta C=b-a; inta x,y,gcd; extend_gcd(A,B,x,y,gcd); if(C%gcd!=0) cout<<"FOREVER"<<endl; else { x=x*C/gcd; m/=gcd; x=(x%m+m)%m; cout<<x<<endl; } } }
注意的要点就是 不能直接写m=1<<k; 否则 1<<k 不会被当成long long