POJ-2115-C Looooops(線形合同式)

リンク:

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;
}

おすすめ

転載: www.cnblogs.com/YDDDD/p/11789741.html