mayoko’s diary

プロコンとかいろいろ。

SRM 657 div2 hard:PolynomialRemainder

いよいよ明日がCODE FESTIVAL2015予選A本番ですよ!むっちゃドキドキしてきた…。コンテスタントの皆さん、今日くらいは勉強は休んで明日に備えますよね?

あと 5 分です

解法

2^9 と 5^9 について余りが 0 になっていれば良いです。

そうなるように条件を揃えましょう。

int getRoot(int a, int b, int c, int mod) {
    for (ll x = 0; x < mod; x++) {
        ll p = (a*(x*x%mod)) % mod;
        ll q = (b*x)%mod;
        ll r = c;
        if ((p+q+r)%mod == 0) return (int)x;
    }
    return -1;
}

class PolynomialRemainder {
public:
    int findRoot(int a, int b, int c) {
        const int POW2 = 2*2*2 * 2*2*2 * 2*2*2;
        const int POW5 = 5*5*5 * 5*5*5 * 5*5*5;
        int x2 = getRoot(a, b, c, POW2);
        int x5 = getRoot(a, b, c, POW5);
        if (x2 == -1 || x5 == -1) return -1;
        int x = x5;
        while (x%POW2 != x2) {
            x += POW5;
        }
        return x;
    }
};