リンク:
https://vjudge.net/problem/POJ-2115
質問の意味:
コンパイラのミステリー:我々は、種類のループのためのC言語のスタイル与えられている
ため(変数= A;変数= B;変数+ = Cを!)
ステートメント;
すなわち、Aの評価に変数を設定することにより開始され、変数はBと等しくない間ループは、我々は文はA、Bの特定の値のために実行を取得ん回数を知りたいC.によって変数を増やすことで、その後の文を繰り返し、及びC、すべての算術演算は、モジュロ2 k個(値が0 <= xの<2 kに)kビットの符号なし整数型で計算されると仮定。
アイデア:
溶液\(A * X + C \当量のB(MOD \、2 ^ K)\) 。
変換\(C * X + 2 = K BA ^ \) 。
拡張ユークリッドを解消。
コード:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<math.h>
#include<vector>
using namespace std;
typedef long long LL;
const int INF = 1e9;
const int MAXN = 1e6+10;
LL a, b, c, k;
LL ExGcd(LL a, LL b, LL &x, LL &y)
{
if (b == 0)
{
x = 1, y = 0;
return a;
}
LL d = ExGcd(b, a%b, x, y);
LL tmp = x;
x = y;
y = tmp - (a/b)*y;
return d;
}
int main()
{
while(~scanf("%lld%lld%lld%lld\n", &a, &b, &c, &k) && (a || b || c || k))
{
LL x, y;
LL B = 1LL<<k;
LL d = ExGcd(c, B, x, y);
if ((b-a)%d != 0)
{
puts("FOREVER");
continue;
}
x = x*(b-a)/d;
x = (x%(B/d)+(B/d))%(B/d);
printf("%lld\n", x);
}
return 0;
}