@bzoj - いくつかの問題を4870 @組み合わせ


desription @ @

要件:

\ [\ Sum_ {I = 0} ^ {\ inftyの} C_ {NK} ^ {I + R} \ MOD P \]

元のタイトルポータル。

@解決@

これは、問題は、あなたの裸の反転部のルートではありません

モジュラスとは何の特殊性に気づいていない、組み合わせの数の漸化式から始めることも考えられます。
K = 1が実際に速いの力である場合には、ので、多分私達は、マトリックスパワーの最適化を考えることができます。

\(F_n(R&LT)= \ sum_ {I = 0} ^ {\ inftyの} C_ {NK} ^ {IK + R&LT} \)次に、:
\ [F_n(R&LT)= \ sum_ {J = 0} ^ {K} C_ {K} ^ {J} \回F_ {N-1}(R - J \ MOD K)\]

上記の式の組み合わせから意味を理解するのは簡単です。
それは、そのような行列Aに構成することができる\(A_ C_ {\のijの{} = ^ {K} IJ} + K MOD [= 0のIJ \ MOD K] \) 実行\(O(K ^ 3 \ログN)\)マトリックス加速度。

この質問は、データをリードすることができますがのように見えるの範囲であるが、最適化の方法が速くあります。
ノートは巡回行列、すなわち、である\({G} = \ MOD Kの(IJ)\のA_のIJ) プルーフながら電力も巡回行列でなければなりません。
したがって、唯一のA gを復元することができ、対応するAを維持する必要があり、そしてGは維持である\(O(K ^ 2) \) 合計時間の複雑性が低減されるように畳み込み、に\(O(K ^ 2 \ログN-)\)

:あなたは、上述したアルゴリズムはよく理解されていないと感じた場合、実際には、本実施形態と理解すべき別の問題がある
\ [F_ {A + B}(R&LT)= \ sum_ {J} = 0 {K} ^ F_A(J)\タイムズF_B(R - J \ MOD K )\]

同様に、意味は、上記の式の組み合わせから理解することは簡単です。
すなわちそれは、状態DPの間で「複雑な」操作に使用することができます。Dpがそう直接その後、「複合」の必要性2のパワーは、それらをすることができ、倍増します。
まあ、これ以上の方法は、砥石と同等であることを理解します。

@acceptedコード@

#include <cstdio>
#include <algorithm>

int n, p, k, r;
inline int add(int x, int y) {return (x + y >= p ? x + y - p : x + y);}
inline int mul(int x, int y) {return 1LL * x * y % p;}

int t[55];
void merge(int *A, int *B, int *C) {
    for(int i=0;i<k;i++) t[i] = 0;
    for(int i=0;i<k;i++)
        for(int j=0;j<k;j++) {
            int p = (i + j >= k ? i + j - k : i + j);
            t[p] = add(t[p], mul(A[i], B[j]));
        }
    for(int i=0;i<k;i++) C[i] = t[i];
}

int f[55], g[55];
void get(int n) {
    for(int i=0;i<k;i++) g[i] = (i == 0);
    for(int i=n;i;i>>=1,merge(f, f, f))
        if( i & 1 ) merge(f, g, g);
}
int c[55][55];
int main() {
    scanf("%d%d%d%d", &n, &p, &k, &r);
    for(int i=0;i<=k;i++) {
        c[i][0] = 1;
        for(int j=1;j<=i;j++)
            c[i][j] = add(c[i-1][j], c[i-1][j-1]);
    }
    for(int i=0;i<k;i++)
        f[i] = c[k][i];
    f[0] = add(f[0], c[k][k]);
    get(n), printf("%d\n", g[r]);
}

詳細@

実際に、この考えはまた、に拡張することができる\(A_ {IJ} = G (IJ * A)\) 場合等、上記要望から少し異なるものの。

おすすめ

転載: www.cnblogs.com/Tiw-Air-OAO/p/12431436.html