题目链接:
http://poj.org/problem?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; }
时间: 2024-10-24 18:38:20