1. 程式人生 > >POJ 2115 C Looooops(模線性方程)

POJ 2115 C Looooops(模線性方程)

blank str using while eve printf b- get %d

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\n",ans); 52 } 53 return 0; 54 }

POJ 2115 C Looooops(模線性方程)