标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 18799 | Accepted: 4924 |
Description
for (variable = A; variable != B; variable += C)
statement;
Input
Output
Sample Input
3 3 2 16 3 7 2 16 7 3 2 16 3 4 2 16 0 0 0 0
Sample Output
0 2 32766 FOREVER
Source
分析:
扩展欧几里得:
对于ax+by=c,求最小整数解
d=gcd(a,b)
1.先求ax0+by0=d的x0,y0。然后两边同乘d得a(x0*c/d)+b(y0*c/d)=gcd(a,b)*c/d=c,求出x=x0*c/d,y=y0*c/d
2.求最小解:由上求出特解x,最小解=(x%(b/d)+b/d)%(b/d)
参考学习网站:http://www.cnblogs.com/comeon4mydream/archive/2011/07/18/2109060.html
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<string> 5 #include<cstring> 6 #include<vector> 7 using namespace std; 8 typedef long long ll; 9 ll exgcd(ll a,ll b,ll &x,ll &y){//扩展欧几里得算法 10 if(b==0){ 11 x=1; 12 y=0; 13 return a; 14 } 15 ll d=exgcd(b,a%b,x,y); 16 ll t=y; 17 y=x-a/b*y; 18 x=t; 19 return d; 20 } 21 int main(){ 22 ll A, B, C, k; 23 while(cin>>A>>B>>C>>k&&(A||B||C||k)){ 24 ll b=1ll<<k,x,y; 25 ll c=B-A,a=C; 26 ll d=exgcd(a,b,x,y); 27 if(c%d){ 28 cout<<"FOREVER"<<endl; 29 } 30 else{ 31 b=b/d;//如果少了这歩,最终求得的就可能不是最小整数解,而是某一特解。可以仔细想一想为什么b要除以d 32 //cout<<d<<endl; 33 cout<<((x*c/d%b+b)%b)<<endl;//求最小整数解 34 } 35 } 36 return 0; 37 }
标签:
原文地址:http://www.cnblogs.com/Deribs4/p/4297600.html