POJ2115 C Looooops【解线性同余方程】

题目链接:

?id=2115

题目大意:

对于循环语句:

for(int i = A; i != B; i += C)

语句1;

已知i、A、B、C都是k进制的无符号整数类型,给出A、B、C、k的值,,计算并输出语句1

的执行次数,如果为无限次,那么直接输出"FOREVER"。

思路:

设算法执行X步,那么题目就变为求解A + CX≡ B( mod M)(M= 2^k)。即A + CX + MY≡ B。

CX + MY≡ B – A(M = 2^k),就变为了求 线性同余方程,简单的套用线性同余求解算法即可。

AC代码:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;__int64 A,B,C,k;__int64 a,b,c,d,x,y;void ExGCD(__int64 a,__int64 b,__int64 &d,__int64 &x,__int64 &y){if(!b)x = 1, y = 0, d = a;else{ExGCD(b,a%b,d,y,x);y -= x * (a/b);}}int main(){while(cin >> A >> B >> C >> k && (A||B||C||k) ){a = C;c = B – A;b = (__int64)1 << k;ExGCD(a,b,d,x,y);if(c % d != 0)cout << "FOREVER" << endl;else{__int64 ans,temp;ans = x * c/d;temp = b/d;ans = ans % temp + temp;cout << ans % temp << endl;}}return 0;}

辽远或偏僻的地方,而会常常想起这一次的旅行,

POJ2115 C Looooops【解线性同余方程】

相关文章:

你感兴趣的文章:

标签云: