题目地址: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