Wannafly 겨울 캠프 2020 일 6J K 重 排列 - DP

상대 \ (K 것은 \) 개수 (\ n \) 사이클 순열. \ (100 당량 T \ n은 50 당량은 \ K \는 ^ {18} \ 10 당량)

해결책

치환 그래프 관한 여러 고리를 시도 할 수 있고, 다음 DP 제공 고려 \ (F [I] \) 대표 \ (N = 1 \) 다음, 응답 시간,
\ [F [I] = \ sum_을 { J = 1} ^ N [J | K] \ cdot C_ {I-1} ^ {J-1} \ cdot (j-1) \ cdot F [IJ] \]!

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int mod = 998244353;
const int N = 105;
int t,n,k,f[N],c[N][N],frac[N];

signed main() {
    frac[0]=1;
    for(int i=1;i<=100;i++) frac[i]=(frac[i-1]*i)%mod;
    for(int i=0;i<=100;i++) c[i][0]=1;
    for(int i=1;i<=100;i++) {
        for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
    }
    cin>>t;
    while(t--) {
        cin>>n>>k;
        memset(f,0,sizeof f);
        f[0]=1;
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=i;j++) {
                if(k%j==0) {
                    f[i]+=c[i-1][j-1]*frac[j-1]%mod*f[i-j]%mod;
                    f[i]%=mod;
                }
            }
        }
        cout<<f[n]<<endl;
    }
}

추천

출처www.cnblogs.com/mollnn/p/12367700.html