标签:des style blog http color os io strong
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
考察扩展欧几里得算法:
#include <stdio.h> #include <math.h> long long extended_euclid(long long a, long long b, long long &x, long long &y ) { if(b==0) { x=1; y=0; return a; //d=a,x=1,y=0,此时等式d=ax+by成立 } int d=extended_euclid(b, a%b, x, y ); int xt=x; x=y; y=xt-a/b*y; return d; } int main() { int A, B, C, k; long long a, b, c; long long n; while(scanf("%d %d %d %d", &A, &B, &C, &k)!=EOF) { if(A==0 && B==0 && C==0 && k==0) break; n=1; for(int i=1; i<=k; i++) { n=n*2; } a=C; b=B-A; long long x, y; long long d=extended_euclid (a, n, x, y ); if(b%d!=0) //无解 { printf("FOREVER\n"); continue ; } x=(x*(b/d))%n; x=(x%(n/d)+n/d)%(n/d); printf("%lld\n", x); } return 0; }
别人写的的代码+解析:
#include<iostream> using namespace std; //d=ax+by,其中最大公约数d=gcd(a,n),x、y为方程系数,返回值为d、x、y __int64 EXTENDED_EUCLID(__int64 a,__int64 b,__int64& x,__int64& y) { if(b==0) { x=1; y=0; return a; //d=a,x=1,y=0,此时等式d=ax+by成立 } __int64 d=EXTENDED_EUCLID(b,a%b,x,y); __int64 xt=x; x=y; y=xt-a/b*y; //系数x、y的取值是为满足等式d=ax+by return d; } int main(void) { __int64 A,B,C,k; while(scanf("%I64d %I64d %I64d %I64d",&A,&B,&C,&k)) { if(!A && !B && !C && !k) break; __int64 a=C; __int64 b=B-A; __int64 n=(__int64)1<<k; //2^k __int64 x,y; __int64 d=EXTENDED_EUCLID(a,n,x,y); //求a,n的最大公约数d=gcd(a,n)和方程d=ax+by的系数x、y if(b%d!=0) //方程 ax=b(mod n) 无解 cout<<"FOREVER"<<endl; else { x=(x*(b/d))%n; //方程ax=b(mod n)的最小解 x=(x%(n/d)+n/d)%(n/d); //方程ax=b(mod n)的最整数小解 printf("%I64d\n",x); } } return 0; }
POJ 2115 C Looooops,布布扣,bubuko.com
标签:des style blog http color os io strong
原文地址:http://www.cnblogs.com/yspworld/p/3897889.html