http://poj.org/problem?id=2115
题意:
给你一个变量,变量初始值a,终止值b,每循环一遍加c,问一共循环几遍终止,结果mod2^k.如果无法终止则输出FOREVER。
思路:
根据题意原题可化成c * x = b - a mod (2 ^ k),然后解这个模线性方程。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath> 10 #include<map> 11 using namespace std; 12 typedef long long ll; 13 typedef pair<int,int> pll; 14 const int INF=0x3f3f3f3f; 15 const int maxn=1000+5; 16 17 int a,b,c,k; 18 19 void gcd(ll a,ll b,ll& d,ll& x,ll& y) 20 { 21 if(!b) {d=a;x=1;y=0;} 22 else 23 { 24 gcd(b,a%b,d,y,x); 25 y-=x*(a/b); 26 } 27 } 28 29 ll modeq(ll a,ll b,ll n) 30 { 31 ll e,i,d,x,y,f; 32 gcd(a,n,d,x,y); 33 if(b%d) return -1; 34 else 35 { 36 f=n/d<0?(-1*n/d):n/d; 37 e=(x*(b/d)%f+f)%f; 38 return e; 39 } 40 } 41 42 int main() 43 { 44 //freopen("D:\input.txt","r",stdin); 45 while(~scanf("%d%d%d%d",&a,&b,&c,&k) && a+b+c+k!=0) 46 { 47 ll n=b-a; 48 ll m=1LL<<k; 49 ll ans = modeq(c,n,m); 50 if(ans==-1) puts("FOREVER"); 51 else printf("%lld ",ans); 52 } 53 return 0; 54 }