サンプルに分割[十二州試験2019]カンニング

ポータル

  この質問は、癌の問題である、と彼はブロガー過ごした\(\ {テキスト1DAY} \ ) 独立して解決する\(16 \)サブタスクを。ここでは、質問に来ます。

サブタスク1-3:1_998244353

  この観察は、必要なデータを得ることは困難ではない(X-19 ^ \ BMOD 998 244 353 \)\、あなたが直接従事することができます。可能性に留意\(X \)はフェルマーの小定理のに応じて、非常に大きいです\(1-X ^ {P} \当量。1 \ PMOD P \) 我々はする必要が剰余を読みます

サブタスク4:1?

  観察とヒントを教えてくれる:まだ模索\(X-19 ^を\)が、モジュラスを知りません。これは、出力ファイルの最大値ことがわかった\(10 ^ 6 \)私たちは知ることができ、最後に最初の直接入力爆発テスト検索、取る、またはそう\(P = 1145141 \を)

サブタスク5:1 +

  これは、前者の拡張バージョンであり、弾性率で発見された\(5 \回10 ^ { 18} \) ほど、悪い暴力。どのようにそれを行うには?私は、2つの入力見出さ、入力配列の行数を持っていた\(X \)差の\(2 \)を、私は、これらの二つのグループが得られた出力に対応する実測値:\(19 ^ {264 708 066} \当量1996649514996338529 \ PMOD Pが\)\(19 264 708 068 ^ {}当量1,589,589,654,696,467,295 \ PMOD P \ \) これは、上記の式の乗算され、\(2 19 ^ \)その後、剰余を求めることができる次の図は、我々が得る:\(1996649514996338529 \タイムズ19 ^ 2 \当量1589589654696467295 \ PMOD P \) そして、この式を書き換える:(1996649514996338529 \タイムズ361-NP = 1,589,589,654,696,467,295 \)\、で見つかった右側に一定の(長い\ロングは\)\範囲内で計算することができない、私が使用\(長い\ダブル\)を算出しました。近似。その後、\(P \)はこの数倍でなければなりません。見つかった\(N- \)\(100 \)する\(\ 200)以下、私はと同様判明に加えて、デジタルに考慮にアナログの精度を取って、暴力のほかにしようとします\(\午後千\)入力と出力判定ビットの最初のセット内で、最終的にはモジュラスた\を(P = 5211600617818708273 \)

サブタスク6-7:1wa_998244353

  調査結果は求めていません\(^ 19のx \ BMOD 998244353 \) 、およびに置き換える\(int型\)ステップバイステップをした後、オーバーフローの問題を無視して、直接剰余を取ります。コードは以下の通りです。

    x = (int)(x * 19) % 998244353;

  最初の\(6 \)を解決する直接注文を指します。最初の\(7 \)は、それがOKではない、という指摘\(X- \)すぎ。私は仕事を見つける、解決する力を書き換えるために高速だと思うようになりました。私は何もしませんが、私が最初にしましょう(6 \)は\以上に行くことを指す\(10 ^ 6 \)のグループを、我々は循環部を発見しました。以下からのもので、\(X = 55246 \) すべての始まり\(45699 \)時間のサイクル数を。これは、のことを思い出す\(\ {テキストポラード-Rhoの } \) アルゴリズムリングと\(\ロー\)のように。もちろん、あなたが直接、上記のプロパティを使用することができ、そのアルゴリズム、とは何の関係も。

サブタスク14-16:2G && 2グラム+

  私は目の前で行われた\(6 \)\(\テキスト{サブタスク} \ ) 直ちに実行した後。最初の2点、3つの番号を尋ねるたびに\(Lの\)、\ (R&LT \)、\ (Pは\)必要\(Lの\)をする(R&LT \)\型で\(P \)元のルートの下に。最初のための\(14 \)ポイント、\(P = 998 244 353 \)場合、\(\ varphi(P)= P-1 = 998 244 352 = 2 ^ {23である} \回7 \回17 \) 異なる理由唯一の品質係数の\(3 \) Aは、試験に加えて、直接原始根か否かを判断することができます。

  最初のための\(15 \)点、\(P = 13123111 \)、\ (\ varphi(P)= 13123110 = 2×3×5×7×11×13×である。19×23 \である)、及び数字を決定しますまでの(10 ^ 7 \)\確かにしようとするだけでなく、数ヶ月を\(\テキスト{T} \)そして私たちは、ルートトラバーサルから他の元原始根のいずれかを使用することができます。ここで\(G \)取る\(6 \)を、以降の\(G ^ Tの\)全てを介して\(\ varphi(P)\ ) 番目と\(P \)素数、場合にのみ、および\(T \)\(\ varphi(P)\ ) プライムタイム\(G ^ Tの\)は原始根です。だから我々は、使用\(\ varphi(P)\ ) の素因数\(T \)モジュロ判断を。プライマリルートを横断した後それをすべて見つけることができます。

  最初の場合は(16 \)\ポイント、データに基づいて、未知のクエリモジュールの最後のグループは、我々は原始根の剰余を逆転します。ことを示唆している\(10 ^ 9 \)をする(2 \回10 ^ 9 \ \)の間と素数である、我々は、次に、従来の試験部門によって元のルートは、生存可能な品質の数を決定することができ、いずれかを見つけます。\(\ FORALL G \) 場合\(G ^ \ P-FRAC。1} {2} {\当量ない\ 1 \ PMOD P \)次いで\(P \)は、我々はモジュラスを探している可能性が非常に高いです。私のコンピュータは、程度走った\(5分の\)番号見つかった\(P = 1515343657 \)を、正しいことが判明してテストします。これは、原始根と使用して発見された\(P = 998244353 \)の方法として。だから、解決しました。

サブタスク8-10:2P

  我々は、解析項\(Lを\)(\ R&LT)\各数値は内素数ではありません。範囲がわずかに大きいメッシュ数であり、次に画面に、この小数部を使用してもよい、直鎖状小さな画面であってもよい\(Lの\)する(R&LT \)を\が、直接I上の\(\テキスト{ミラーラビン} \)アルゴリズムがあってもよい(\ログN \)\番号をテストする時間をかけて素数、正しいレートではない\(1 - 。。。(\ FRAC {1} {4})^ S \)、\ (S \)テストの数です。この問題は、あまりにもそれに二十から三数なので、一定の小さな万能を選択しているようです。

サブタスク11-13:2U

  ここで私たちが選別しましょう\(リットル\)をする(R \)\メビウス関数を。

  上記のように、我々は小規模選別することができます\(\ムー\)の前に2点を失っていました。私が使用して、そうは思いませんでした\(\テキスト{ポラード-Rhoのは } \) の前に、その後ダウン暴力的なブレークを選別するために\(10 ^ 6 \)メビウス関数を、私たちは第二の点があまりにも頑固です発見しました。どのようにそれを行うには?最大数\(10 ^ {18} \)遮蔽場合、私が考える\(^ 6〜10 \する)、次いで内プライミングは、これらの数字をスクリーニングするために素数を使用する、特定の数の残りの素因数\(\ GEQ 10 ^ 6 \) その数の残りの部分でほとんど唯一の2素因数、すなわち、以下の3つの条件:

  まず、残り数が有する素数であり、\(\テキスト{ミラーラビン } \) この時点で宣告があろう\(\ MU \)を乗じた\(--1 \)

  第二に、残りの数は2つの異なる素数の積であり、ネガが正を行い、今回はしない\(\ミュー\)の拠出を生成します。

  第三に、残りの数が素数の正方形です。この時間\(MUは\ \)する\(0 \)

  次いで未満で処理\(10 ^ 6 \)スクリーンにこれらの要因の数であり、維持\(\ MU \)は、解決することができます。

  しかし、因子を含有削除正方形の数に注意を払うこと。最後に、この質問の解決策が終了されるだろう。

\\ AC代码
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ull unsigned long long
#define rep(i, a, b) for (register int i = a, end = b; i <= end; i++)
#define repd(i, a, b) for (register int i = a, end = b; i >= end; i--)
#define chkmax(a, b) a = max(a, b)
#define chkmin(a, b) a = min(a, b)
#define INF (1<<30)
#define pb push_back
#define mp(a, b) make_pair(a, b)
#define fst first
#define snd second
#define pii pair<int, int>

char s[15];

namespace _998244353 {
    int N;
    ull P;
    ull v;

    inline void inc(ull &a, ull b, ull p) {
        a += b;
        if (a >= p) a -= p;
    }

    ull Mult(ull a, ull b, ull p) {
        ull res = 0;
        for (ull k = a; b; inc(k, k, p), b >>= 1)
            if (b & 1) inc(res, k, p);
        return res;
    }

    ull qpow(ull a, ull b, ull p) {
        ull res = 1;
        for (register ull k = a; b; k = Mult(k, k, p), b >>= 1)
        if (b & 1) res = Mult(res, k, p);
        return res;
    }

    inline ull read() {
        ull w = 0; char c;
        while (!isdigit(c = getchar())) ;
        while (isdigit(c)) w = ((w << 3) + (w << 1) + (c ^ 48)) % (P-1), c = getchar();
        return w;
    }
    void main(ull orz) {
        P = orz;
        scanf("%d", &N);
        rep(i, 1, N) {
            v = read();
            printf("%llu\n", qpow(19, v, P));
        }
    }
}

namespace WA {
    int N;
    int ans[55246+45699+5];
    void main() {
        scanf("%d", &N);
        ans[0] = 1;
        rep(i, 1, 55246+45699) {
            ans[i] = (int)(ans[i-1]*19)%998244353;
        }
        rep(i, 1, N) {
            ll val;
            scanf("%lld", &val);
            if (val <= 55246+45699) printf("%d\n", ans[val]);
            else printf("%d\n", ans[(val-55246)%45699+55246]);
        }
    }
}

namespace GG {
    int qpow(int a, int b, int p) {
        int res = 1;
        for (register int k = a; b; k = (ll)k*k%p, b >>= 1)
            if (b & 1) res = (ll)res * k % p;
        return res;
    }
    void run1(int l, int r, int p) {
        if (p == 998244353) {
            rep(i, l, r) if (qpow(i, 499122176, 998244353) != 1 && qpow(i, 142606336, 998244353) != 1 && qpow(i, 58720256, 998244353) != 1) printf("g"); else printf(".");
        } else {
            rep(i, l, r) 
                if (qpow(i, 757671828, 1515343657) != 1 && qpow(i, 505114552, 1515343657) != 1 &&
                    qpow(i, 378552, 1515343657) != 1 && qpow(i, 96072, 1515343657) != 1) printf("g"); else printf(".");
        }
        puts("");
    }
    int st[13123120];
    void run2(int p) {
        memset(st, 0, sizeof(st));
        int g = 6, cnt = 0;
        do {
            cnt++;
            if (cnt % 2 && cnt % 3 && cnt % 5 && cnt % 7 && cnt % 11 && cnt % 13 && cnt % 19 && cnt % 23) st[g] = 1;
            g = g*6%p;
        } while (g != 6);
        rep(i, 1, 13123110) if (st[i]) printf("g"); else printf(".");
        puts("");
    }
}

namespace PP {
    inline ll Mult(ll a, ll b, ll p) {
        ll c = (ll)a*b - (ll)((ull)((long double)a*b/p)*p);
        return c < 0 ? c+p : ((ull)c >= (ull)p ? c-p : c);
    }

    ll qpow(ll a, ll b, ll p) {
        ll res = 1;
        for (register ll k = a; b; k = Mult(k, k, p), b >>= 1)
            if (b & 1) res = Mult(res, k, p);
        return res;
    }
    int test[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
    bool MR(ll P, int cnt = 10) {
        ll s = P-1; int t = 0;
        while (!(s & 1)) s >>= 1, t++;
        rep(i, 0, cnt-1) {
            if (P == test[i]) return true;
            if (test[i] > P) return false;
            ll a = qpow(test[i], s, P), nxt;
            rep(x, 1, t) {
                nxt = Mult(a, a, P);
                if (nxt == 1 && a != 1 && a != P-1) return false;
                a = nxt;
                if (a == 1) break;
            }
            if (a != 1) return false;
        }
        return true;
    }
    int N;
    void main() {
        scanf("%d", &N);
        while (N--) {
            ll l, r;
            scanf("%lld%lld", &l, &r);
            while (l <= r) {
                if (MR(l)) printf("p"); else printf(".");
                l++;
            }
            puts("");
        }
    }
}

namespace UU {
    int N;
    int check[1000005], p[100000];
    void init() {
        memset(check, 0, sizeof(check));
        p[0] = 0;
        rep(i, 2, 1000000) {
            if (!check[i]) p[++p[0]] = i;
            for (register int j = 1; j <= p[0] && i*p[j] <= 1000000; j++) {
                check[i*p[j]] = 1;
                if (!(i % p[j])) break;
            }
        }
    }
    ll frac[1000001], mu[1000001];
    bool issqr(ll x) {
        ll v = sqrt(x);
        if (v*v == x || (v-1)*(v-1)==x || (v+1)*(v+1)==x) return true;
        return false;
    }
#define cc(x) ((x) == 0 ? '0' : ((x) < 0 ? '-' : '+'))
    void main() {
        init();
        scanf("%d", &N);
        while (N--) {
            ll l, r;
            scanf("%lld%lld", &l, &r);
            rep(i, 0, r-l) mu[i] = frac[i] = 1;
            rep(i, 1, p[0]) {
                ll x = 1ll*p[i]*p[i], st = l-(l-1)%x-1+x;
                while (st <= r) {
                    mu[st-l] = 0; frac[st-l] = st; st += x;
                }
                x = p[i], st = l-(l-1)%x-1+x;
                while (st <= r) {
                    mu[st-l] = -mu[st-l];
                    if (frac[st-l] != st) frac[st-l] *= x;
                    st += x;
                }
            }
            for (register ll i = l; i <= r; i++) {
                ll val = i/frac[i-l];
                if (val == 1) printf("%c", cc(mu[i-l]));
                else if (PP::MR(val, 2)) printf("%c", cc(-mu[i-l]));
                else if (issqr(val)) printf("0");
                else printf("%c", cc(mu[i-l]));
            }
            puts("");
        }
    }
}

int main() {
    srand(time(0));
    scanf("%s", s);
    if (s[2] == '9') _998244353::main(998244353);
    if (s[1] == '?') {
        if (s[2] == '+') {
            _998244353::main(5211600617818708273ll);
        } else {
            _998244353::main(1145141);
        }
    }
    if (s[1] == 'w') {
        WA::main();
    }
    if (s[1] == 'g') {
        int l, r, p, N;
        if (s[2] == '?') {
            scanf("%d", &N);
            while (N--) {
                scanf("%d%d", &l, &r);
                if (N) scanf("%d", &p); else p = 1515343657;
                GG::run1(l, r, p);
            }
        } else {
            scanf("%d", &N);
            while (N--) {
                scanf("%d%d%d", &l, &r, &p);
                if (p == 998244353) GG::run1(l, r, p);
                else GG::run2(p);
            }
        }
    }
    if (s[1] == 'p') {
        PP::main();
    }
    if (s[1] == 'u') {
        UU::main();
    }

    return 0;
}

おすすめ

転載: www.cnblogs.com/ac-evil/p/11774865.html