题目地址:http://poj.org/problem?id=2115
题目大意:给你一个循环, for (int i=a, i!=b; i+=c), 并且告诉你计算机是多少位的操作系统,意思就是i到达多少的时候取模,比如65535,当i 大于 65535时,在从1开始算。这也是一道简单的拓展欧几里德模板题。
对于输入的数据可以列式子:A+KC mod 2k = B 转换后得到KC + 2ky = B-A, 直接套模板就可以了
AC代码:
#include <iostream>
using namespace std;
typedef long long ll;
void exgcd(ll a, ll b, ll &gcd, ll &x, ll &y)
{
if (b == 0)
{
x = 1;
y = 0;
gcd = a;
}
else
{
exgcd(b, a%b, gcd, y, x);
y -= (a/b)*x;
}
}
int main()
{
ll aa, bb, cc, k;
while (cin >> aa >> bb >> cc >>k, (aa+bb+cc+k))
{
ll a = cc;
ll c = bb - aa;
ll b = ll(1) << k;
ll gcd, x, y;
exgcd(a, b, gcd, x, y);
if (c % gcd)
{
cout << "FOREVER" << endl;
}
else
{
b/=gcd;
c/=gcd;
x = ((x*c)%b + b)%b;
cout << x << endl;
}
}
return 0;
}