• CodeForces 340E Iahub and Permutations 错排dp


    Iahub and Permutations

    题解:

    令 cnt1 为可以没有限制位的填充数字个数。

    令 cnt2 为有限制位的填充数字个数。

    那么:对于cnt1来说, 他的值是cnt1!

    然后我们对cnt2进行dp。

    对于任意一个新加进来的数字,我们可以令一个一个没有限制位数放在这里, 那么新加进来的数字 ≈ 没有限制位, 他的方案为 i-1 * dp[i-1]

    , 然后我们如果把这个数字放到有限制位的数来说, 那么他的转移方程就和错排一样了。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
    #define LL long long
    #define ULL unsigned LL
    #define fi first
    #define se second
    #define pb push_back
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define lch(x) tr[x].son[0]
    #define rch(x) tr[x].son[1]
    #define max3(a,b,c) max(a,max(b,c))
    #define min3(a,b,c) min(a,min(b,c))
    typedef pair<int,int> pll;
    const int inf = 0x3f3f3f3f;
    const int _inf = 0xc0c0c0c0;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const LL _INF = 0xc0c0c0c0c0c0c0c0;
    const LL mod =  (int)1e9+7;
    const int N = 1e5 + 100;
    LL dp[N];
    int fvis[N];
    int vis[N];
    int cnt1, cnt2;
    int main(){
        int n, t;
        scanf("%d", &n);
        for(int i = 1; i <= n; ++i){
            scanf("%d", &t);
            if(t == -1) continue;
            vis[t] = 1;
            fvis[i] = 1;
        }
        for(int i = 1; i <= n; ++i){
            if(vis[i] + fvis[i] == 2) ;
            else if(!vis[i] && fvis[i]) cnt1++;
            else if(vis[i] + fvis[i] == 0) cnt2++;
        }
        dp[0] = 1;
    //    cout << cnt1 << " " << cnt2 << endl;
        for(int i = 1; i <= cnt1; ++i) dp[0] = dp[0] * i % mod;
        for(int i = 1; i <= cnt2; ++i){
            dp[i] = cnt1 * dp[i-1] % mod + (i-1) * dp[i-1] % mod;
            if(i >= 2) dp[i] += (i-1) * dp[i-2] % mod;
            dp[i] %= mod;
    //        cout << dp[i] << endl;
        }
        cout << dp[cnt2] << endl;
        return 0;
    }
    View Code
  • 相关阅读:
    增强遍历和Object多参数遍历
    Git忽略规则(.gitignore配置)不生效原因和解决
    算法基本概念及常用算法Python实现
    使用GitBook编写项目文档
    Python 闭包
    Linux 进程管理
    Kafka 安装及入门
    IP地址0.0.0.0表示什么
    Docker 入门
    Docker Linux下安装
  • 原文地址:https://www.cnblogs.com/MingSD/p/10859300.html
Copyright © 2020-2023  润新知