• HDU3664 Permutation Counting


    Permutation Counting

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1487    Accepted Submission(s): 754

    Problem Description
    Given a permutation a1, a2, … aN of {1, 2, …, N}, we define its E-value as the amount of elements where ai > i. For example, the E-value of permutation {1, 3, 2, 4} is 1, while the E-value of {4, 3, 2, 1} is 2. You are requested to find how many permutations of {1, 2, …, N} whose E-value is exactly k.
     
    Input
    There are several test cases, and one line for each case, which contains two integers, N and k. (1 <= N <= 1000, 0 <= k <= N). 
     
    Output
    Output one line for each case. For the answer may be quite huge, you need to output the answer module 1,000,000,007.
     
    Sample Input
    3 0
    3 1
     
    Sample Output
    1
    4
    Hint
    There is only one permutation with E-value 0: {1,2,3}, and there are four permutations with E-value 1: {1,3,2}, {2,1,3}, {3,1,2}, {3,2,1}
     
    Source
     
    题意:对于任一种N的排列A,定义它的E值为序列中满足A[i]>i的数的个数。给定N和K(K<=N<=1000),问N的排列中E值为K的个数。
    dp[i][j]表示前i个数的排列中E值为j的个数,所以当插入第i+1个数时,如果放在第i+1或满足条件的j个位置时,j不变,与其余i-j个位置上的数调换时j会+1。所以
    dp[i+1][j] = dp[i+1][j] + (j + 1) * dp[i][j];
    dp[i+1][j+1] = dp[i+1][j+1] + (i - j) * dp[i][j];
     
    /*
    ID: LinKArftc
    PROG: 3664.cpp
    LANG: C++
    */
    
    #include <map>
    #include <set>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <cstdio>
    #include <string>
    #include <utility>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define eps 1e-8
    #define randin srand((unsigned int)time(NULL))
    #define input freopen("input.txt","r",stdin)
    #define debug(s) cout << "s = " << s << endl;
    #define outstars cout << "*************" << endl;
    const double PI = acos(-1.0);
    const double e = exp(1.0);
    const int inf = 0x3f3f3f3f;
    const int INF = 0x7fffffff;
    typedef long long ll;
    
    const int maxn = 1010;
    const int MOD = 1000000007;
    
    ll dp[maxn][maxn];
    int n, k;
    
    void init() {
        dp[1][0] = 1;
        dp[1][1] = 0;
        for (int i = 1; i <= 1000; i ++) {
            for (int j = 0; j <= 1000; j ++) {
                dp[i+1][j] = (dp[i+1][j] % MOD + (j + 1) * dp[i][j] % MOD) % MOD;
                dp[i+1][j+1] = (dp[i+1][j+1] % MOD + (i - j) * dp[i][j] % MOD) % MOD;
            }
        }
    }
    
    int main() {
    
        init();
        while (~scanf("%d %d", &n, &k)) {
            printf("%d
    ", dp[n][k]);
        }
    
        return 0;
    }
     
  • 相关阅读:
    rabbitmq线上服务器与项目结合的问题总结
    关于RabbitMQ Queue Argument的简介
    rabbitmq代码配置
    python基础篇17-虚环境
    Java-实体与集合转换
    Java-精确计算工具类
    Java-汉字繁体拼音转换
    Java-集合条件筛选
    Java-发邮件
    Java-MD5
  • 原文地址:https://www.cnblogs.com/LinKArftc/p/4903121.html
Copyright © 2020-2023  润新知