http://poj.org/problem?id=2115
自己最不喜欢的就是数论题 但不能因为不喜欢就不去做了 做会了就喜欢了
通过做道题本人需要深刻的反省,做这道题浪费了我太多时间 代码中的long long 较多其中两个写成了long
我愣是没看出来结果悲剧了N久 就此反省
1.细心,不能代码一多就乱了
2.明明可以用个#define long long LL 之类的代替的,既省时间有安全,为什么没用呀!亲。
3.代码久调试不对,更放一下就的放一下。让脑子清醒一下。这道题就是。回去睡了一觉回来没用5分钟就发现错误了
伤不起呀,以后要多加注意呀,得养成良好的编码习惯。
对于扩展欧几里得算法理解的还不够清楚。
天下尚未拿下,天才仍需努力。
#include<iostream> #include<cmath> #include<string> #include<cstring> #include<queue> #include<map> #include<cstdio> using namespace std; long long dd(long long a,long long b,long long &x,long long &y) { // cout<<a<<" "<<b<<endl; if(b==0) { x=1;y=0; return a; } long long temp=dd(b,a%b,x,y); long long t=x;x=y;y=(t-(a/b)*y); return temp; } long long find(long long a,long long b,long long c) { //cout<<c<<endl; long long x,y; long long d=dd(a,c,x,y); //cout<<b<<" "<<d<<endl; if(b%d!=0) return -1; x=x*b/d; long long t=c/d; x=(x%t+t)%t; return x; // return x*(b/d); } int main() { //freopen("c.in","r",stdin); //freopen("c2.out","w",stdout); long long A,B,C,k; while(cin>>A>>B>>C>>k) { //cout<<A<<" "<<B<<" "<<C<<" "<<k<<endl; if(!A&&!B&&!C&&!k) break; long long l=1; long long ans=find(C,B-A,l<<k); if(ans==-1) printf("FOREVER\n"); else cout<<ans<<endl; } return 0; }