标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 23700 | Accepted: 6550 |
for (variable = A; variable != B; variable += C)
statement;
3 3 2 16 3 7 2 16 7 3 2 16 3 4 2 16 0 0 0 0
0 2 32766 FOREVER
由题意易得(a+cx)%2^k==b,求x最小值。可得同余方程c*x=(b-a)mod2^k。
1 //2016.8.17 2 #include<iostream> 3 #include<cstdio> 4 #include<algorithm> 5 #define ll long long 6 7 using namespace std; 8 9 ll ex_gcd(ll a, ll b, ll& x, ll& y)//扩展欧几里得 10 { 11 if(b==0) 12 { 13 x = 1; 14 y = 0; 15 return a; 16 } 17 ll ans = ex_gcd(b, a%b, x, y); 18 ll tmp = x; 19 x = y; 20 y = tmp-(a/b)*y; 21 return ans; 22 } 23 24 int main() 25 { 26 ll a, b, c, x, y, res, n; 27 int k; 28 while(scanf("%lld%lld%lld%d", &a, &b, &c, &k)!=EOF) 29 { 30 if(!a&&!b&&!c&&!k) 31 break; 32 n = (ll)1<<k; 33 res = ex_gcd(c, n, x, y); 34 cout<<res<<endl<<x<<endl; 35 if((b-a)%res!=0)cout<<"FOREVER"<<endl; 36 else 37 { 38 x = x*(b-a)/res%n;//方程ax=b-a(mod n)的最小解 39 ll tmp = n/res; 40 x = (x%tmp+tmp)%tmp;//最小正数解 41 printf("%lld\n", x); 42 } 43 } 44 45 return 0; 46 }
标签:
原文地址:http://www.cnblogs.com/Penn000/p/5779548.html