zoukankan      html  css  js  c++  java
  • UVALive646 Deranged Exams [容斥+排列组合]

    Deranged ExamsDeranged Exams


    Descriptionmathcal{Description}
    NN 个位置, 求至少前 KK 个数字不在自己位置上的方案数 .


    正解部分
    问题转化为: 求前 KK 个数字存在 在自己位置上的数字 的方案数 .

    分为 1,2,3...K1,2,3...K 个数字在自己位置上的方案,

    比如现在要求 ii 个数字在自己位置上的方案数, 为 CKi(Ni)!C_{K}^i*(N-i)!,
    但是这样会使得 i+1i+1 个数字在自己位置上的方案数多出 11 倍, 于是减去 CKi+1(Ni1)!C_{K}^{i+1}*(N-i-1)!,
    此时又没有了 i+2i+2 个数字在自己位置上的方案数, 于是加上 CKi+2(Ni2)!C_{K}^{i+2}*(N-i-2)!,
    以此类推, 奇加偶减 容斥 即可 .

    症结 ↑

    做了半天发现做错了题!! 本不该做这道题的…


    实现部分

    #include<cstdio>
    #define reg register
    typedef long long ll;
    
    int Test_id;
    int N;
    int K;
    
    ll Jc[25];
    ll C[25][25];
    
    void Work(){
            scanf("%d%d%d", &Test_id, &N, &K);
            ll Ans = 0;
            for(reg int i = 1; i <= K; i ++){
                    if(i & 1) Ans += C[K][i] * Jc[N-i];
                    else Ans -= C[K][i] * Jc[N-i];
            }
            printf("%d %lld
    ", Test_id, Jc[N] - Ans);
    }
    
    int main(){
            C[0][0] = 1;
            for(reg int i = 1; i <= 24; i ++){
                    C[i][0] = 1;
                    for(reg int j = 1; j <= i; j ++)
                            C[i][j] = C[i-1][j] + C[i-1][j-1];
            }
            Jc[0] = 1;
            for(reg int i = 1; i <= 24; i ++) Jc[i] = i * Jc[i-1];
            int T;
            scanf("%d", &T);
            while(T --) Work();
            return 0;
    }
    
    /*
    4
    1 4 1
    2 7 3
    3 10 5
    4 17 17
    */
    
    
  • 相关阅读:
    会计基础-资本与资本公积核算
    FORM 基本控件2
    EBS form的一些知识
    EBS功能安全性基本原理
    主物料界面数据来源
    organization --form 表单中organization 数据来源
    form 相关
    jar/war/ear文件的区别
    ORACLE判别字段是否包含中文
    亲测可用:SecureCRT 7 注册码/序列号
  • 原文地址:https://www.cnblogs.com/zbr162/p/11822563.html
Copyright © 2011-2022 走看看