NOIPのシミュレーションテスト⑨

最初の試験はなり⑨バカ

エンジンルーム直接GGに、喉痛い感じ立ち上がって、ピルを感じ脇の下に触れました。

審査は、(少しくらいの崩壊、持ち去ら

試験問題の順序は、悪意のフルセット。

問題A:随

私は、放棄された上で元のルートプロンプトを見て書いた\(O(nmmod)\)暴力、結果はポイントを介して実行されませんでしたが。

最初、これは誤った期待のタイトル、のためのプログラムの合計数である\(N ^ Mの\) すべての状況の和を得るためには、それ

iがj個の操作、激しい波転送をxのF [i] [j]が数値の値で設定します。式は行列の乗算の形で見つけることができ書き、この部分はあっても、私は書いていないすべてのこれらの試験後、直接見て正の解を、言うことではありません。

オリジナルのルーツを私たちに提示するタスクは、我々は、元のルートを使用します。原始根の力によって残りのP-1の電力でシステム全体を横断することができ、我々は、原始根の配列の形で元の電源を交換することができます。

したがって、元の\は(a_iを* a_j * a_k \ ) の形になる(G ^ G ^ I * J * K = G ^ G ^ {K} IがJ + \を+)を\、乗算は加算なります。

私たちは、私が操作の数が元の根j番目となり表し、元の外観Fを変更しました。

/*
 ______                  ______   
/      \                /      \ 
|      |   |        |   |      |
|      |   |        |   |      |
|      |   |   /\   |   |      |
\______/   \__/  \__/   \______/
*/
#include <bits/stdc++.h>
#define ll long long

const int MO = 1000000007, N = 100005;
int n, m, p, rt;
ll po[N], idx[N], a[N];

struct Matrix {
    ll a[1005];
    friend Matrix operator *(Matrix x, Matrix y) {
        Matrix z = {};
        for (int i = 0; i <= p - 1; i++)
            for (int j = 0; j <= p - 1; j++)
                z.a[(i + j) % (p - 1)] = (z.a[(i + j) % (p - 1)] + x.a[i] * y.a[j]) % MO;
        return z;
    }
    inline void clear() {
        for (int i = 0; i <= p - 1; i++) a[i] = 0;      
    }
    Matrix qpow(int b) {
        Matrix tmp, x = (*this);
        tmp.clear(), tmp.a[idx[1]]++;
        for (; b; b >>= 1, x = x * x)
            if (b & 1) tmp = tmp * x;
        return tmp;
    }
} mtx, ans;

ll qpow(ll x, ll b, ll p) {
    ll tmp = 1;
    for (; b; b >>= 1, x = x * x % p)
        if (b & 1) tmp = tmp * x % p;
    return tmp;
}

inline int getrt(int x) {
    for (int i = 2; i <= x; i++) {
        ll tmp = 1; bool flg = 1;
        for (int j = 1; j <= x - 2; j++) {
            tmp = tmp * i % x;
            if (tmp == 1) {
                flg = 0; 
                break;
            }
        }
        if (flg) return i;
    }
}

signed main() {
    scanf("%d%d%d", &n, &m, &p);
    rt = getrt(p); po[0] = 1;
    for (int i = 1; i <= p - 2; i++)
        po[i] = po[i - 1] * (ll) rt % p, idx[po[i]] = i;
    for (int i = 1; i <= n; i++)
        scanf("%lld", &a[i]), mtx.a[idx[a[i]]]++;
    ans = mtx.qpow(m);
    ll tot = 0;
    for (int i = 0; i <= p - 2; i++)
        tot = (tot + po[i] * ans.a[i]) % MO;
    ll inv = qpow(n, (ll) m * (MO - 2), MO);
    printf("%lld\n", tot * inv % MO);
    return 0;
}

問題B:シングル

cluckと

問題C:タイトル

ほとんどがそうT3、WSL

科学オープンクエスチョンシーケンス:C - > B - > A(

(このことは、読み込まれたすべての質問を置くことを教えてくれる、誰がタイトルが困難昇順に従ってランク付けされなければならなかったことを言いました

ピットに問題がありますが、サブタスク0,1,3は75ポイントに白ですが、私は見ていない2 3で立ち往生しました。

そのトピックアルパン粉とは異なり、昇順に困難で説明しました。

サブタスク0:

水平方向右側に列挙工程数、工程数垂直上方C。答えは\(^ A C_ {N-C_N - A ^ A}のn-C_ { - } 2(a)= C ^ \ N-FRAC {A C C!!} \ {!})

逆事前階乗階乗、ビン

サブタスク1:

右のセットステップ数は、bは、それがスタックの外の問題のようで、> = Bのままでなければならない。答えは猫[N / 2]であるので、いくつかの手順を残しました。

サブタスク3:

サブタスク0と1が閉じられると、レベルA列挙されたステップの右側の数は、subtask1を行うX軸及びY軸側に対応し、Cまでのステップの数を計算することができます。

答えは(^ {C_Nカタログ2A} [A]キャット[C] \)\します

サブタスク2:

この組み合わせ数は、聞いていない私は必死に、容量の結果が出てこない診察室での包含と除外にしてみてください。

それは実際には非常にシンプルなDPです。セットF [i]が背中合わせサブタスク1を満たす最初の列挙子ステップ数jの原点にプログラム番号の原点に対するi番目のステップのために。\(F [I] = F [I - J]猫[J / 2 - 1] * 4 \)

詳細を説明:マイナス1に猫はなぜ添字?J内部のステップは振り出しに戻っていない、アナロジーは、スタックにアクセスすることができ、我々は、スタックが空である任せることはできません。これは、4×4の方向です。

再び開いた質問を質問を読んだ後!

再び開いた質問を質問を読んだ後!

/*
 ______                  ______   
/      \                /      \ 
|      |   |        |   |      |
|      |   |        |   |      |
|      |   |   /\   |   |      |
\______/   \__/  \__/   \______/
*/
#include <bits/stdc++.h>
#define ll long long

const int MO = 1000000007, N = 1000000 + 233;
int n, typ;

ll ans, fac[N], inv[N], cat[N];

ll Qpow(ll x, int b) {
    ll ret = 1;
    for (; b; b >>= 1, x = x * x % MO)
        if (b & 1) ret = ret * x % MO;
    return ret;
}

void init(int t) {
    fac[0] = fac[1] = 1, cat[1] = 1, cat[0] = 1;
    for (int i = 2; i <= t; i++) fac[i] = fac[i - 1] * i % MO;
    for (int i = 0; i <= t; i++) inv[i] = Qpow(fac[i], MO - 2);
    for (int i = 2; i <= t; i++) cat[i] = (cat[i - 1] * (4 * i - 2) % MO * Qpow(i + 1, MO - 2) % MO) % MO;
}

namespace case0 {
    void QAQ() {
        init(n);
        for (int i = 0; i <= n; i += 2) {
            int a = i / 2, c = (n - i) / 2;
            ans = (ans + fac[n] * inv[a] % MO * inv[a] % MO * inv[c] % MO * inv[c] % MO) % MO;
        }
        printf("%lld\n", ans);
    }
}

namespace case1 {
    void QAQ() {
        init(n);
        printf("%lld\n", cat[n / 2]);
    }
}

namespace case2 {
    ll f[N];
    void QAQ() {
        init(n), n /= 2;
        f[0] = 1, f[1] = 4;
        for (int i = 2; i <= n; i++)
            for (int j = 1; j <= i; j++)
                f[i] = (f[i] + 4 * f[i - j] % MO * cat[j - 1]) % MO;
        printf("%lld\n", f[n]% MO);
    }
}

namespace case3 {
    void QAQ() {
        init(n);
        for (int i = 0; i <= n; i += 2) {
            int a = i / 2, c = (n - i) / 2;
            ans = (ans + fac[n] * inv[i] % MO * inv[n - i] % MO * cat[a] % MO * cat[c] % MO) % MO;
        }
        printf("%lld\n", ans);  
    }
}

signed main() {
    scanf("%d%d", &n, &typ);
    if (typ == 0) case0::QAQ();
    if (typ == 1) case1::QAQ();
    if (typ == 2) case2::QAQ();
    if (typ == 3) case3::QAQ();
    return 0;
}

おすすめ

転載: www.cnblogs.com/gekoo/p/11256664.html