LightOJ 1095 Arrange the Numbers-容斥

给出n,m,k,求1~n中前m个正好有k个在原来位置的种数(i在第i个位置)

做法:容斥,先选出k个放到原来位置,然后剩下m-k个不能放到原来位置的,用0个放到原来位置的,有C(m-k,0)*(n-k)!种 - 1个放原来位置的,有C(m-k,1)*(n-k-1)!种+...-...

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int N=1e3+10;
 5 const int INF=0x3f3f3f3f;
 6 const int mod=1e9+7;
 7 int cas=1,T;
 8 int n,m,k,c[N][N];
 9 LL fac[N];
10 void init()
11 {
12     memset(c,0,sizeof(c));
13     c[0][0]=fac[0]=1;
14     for(int i=1;i<N;i++)
15     {
16         fac[i]=fac[i-1]*i%mod;
17         c[i][0]=1;
18         for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
19     }
20     //for(int i=0;i<100;i++)
21     //{
22         //for(int j=0;j<=i;j++) printf("%d ",c[i][j]);
23         //printf("\n");
24     //}
25 }
26 int main()
27 {
28     //freopen("1.in","w",stdout);
29     //freopen("1.in","r",stdin);
30     //freopen("1.out","w",stdout);
31     init();
32     scanf("%d",&T);
33     while(T--)
34     {
35         scanf("%d%d%d",&n,&m,&k);
36         LL ans=0;
37         for(int i=0;i<=m-k;i++)
38         {
39             if(i&1) ans-=c[m-k][i]*fac[n-k-i]%mod;
40             else ans+=c[m-k][i]*fac[n-k-i]%mod;
41             ans%=mod;
42             //printf("%lld\n",ans);
43         }
44         ans=ans*c[m][k]%mod;
45         printf("Case %d: %lld\n",cas++,(ans+mod)%mod);
46     }
47     //printf("time=%.3lf\n",(double)clock()/CLOCKS_PER_SEC);
48     return 0;
49 }

时间: 2024-08-09 02:56:39

LightOJ 1095 Arrange the Numbers-容斥的相关文章

lightoj 1095 - Arrange the Numbers(dp+组合数)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1095 题解:其实是一道简单的组合数只要推导一下错排就行了.在这里就推导一下错排 dp[i]=(i-1)*dp[i-2](表示新加的那个数放到i-1中的某一个位置然后那个被放位置的数放在i这个位置就是i-2的错排)+(i-1)*dp[i-1](表示新加的那个数放到i-1中的某一个位置然后用那个位置被占的数代替i这个位置的数就是i-1的错排) #include <iostream

LightOJ - 1095 - Arrange the Numbers(错排)

链接: https://vjudge.net/problem/LightOJ-1095 题意: Consider this sequence {1, 2, 3 ... N}, as an initial sequence of first N natural numbers. You can rearrange this sequence in many ways. There will be a total of N! arrangements. You have to calculate t

lightoj 1095 - Arrange the Numbers (错排数)

题意: 求n个数的排列,前m个中有k个在自己的位置上的方法数. 思路: 设D[n]为n个元素的错排数. 于是我们有D[1] = 0 D[2] = 1: D[n] = (D[n-1] + D[n-2]) * (i-1) 考虑问题本身,我们首先从前m个数选k个数不动.即C(m,k).对于没有选的前m中的m-k个数肯定是参与了错排,而后面n-m个数中参加错排的个数不定,所以我们枚举一个后面n-m个数中选出i(0 <= i <= n - m)个数有没有参与错排.总共就有n-k-i参与了错排. 综上所述

Light oj 1095 - Arrange the Numbers (组合数学+递推)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1095 题意: 给你包含1~n的排列,初始位置1,2,3...,n,问你刚好固定前m个数中的k个数的位置,问你有多少中排列方案.(比如5 3 2有1 4 3 2 5这种方案,1和3固定了) 思路: 前m个取k个就是C(m, k)个方案.然后就是类似错排的思想,设dp[i]为i个数在初始位置各不相同.其中的组合数用逆元算出. ans = dp[m - k] * C(n - m,

Light OJ 1095 Arrange the Numbers

给定n,m,k,要求在n的全排列中,前m个数字中恰好有k个位置不变,有几种方案?首先,前m个中k个不变,那就是C(m,k),然后利用容斥原理可得 ans=ΣC(m,k)*(-1)^i*C(m-k,i)*(n-k-i)! (0<=i<=m-k) 1 #include<algorithm> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<iostream&g

CF449D Jzzhu and Numbers (状压DP+容斥)

题目大意: 给出一个长度为n的序列,构造出一个序列使得它们的位与和为0,求方案数 也就是从序列里面选出一个非空子集使这些数按位与起来为0. 看了好久才明白题解在干嘛,我们先要表示出两两组合位与和为0的所有情况 先hx一下每个数出现的次数,然后我们从遍历 i ,i 是二进制的数位 然后遍历所有的情况,如果第 i 位有1,那么说明我们去掉第 i 位的1就是又一种情况! 其实我们统计的是所有数在删掉/不删掉每一位的1 所有可能出现的数! 那么,状态内任意组合,不能取空集,总数就是 再根据容斥原理(最玄

Jzzhu and Numbers CodeForces - 449D (高维前缀和,容斥)

大意: 给定集合a, 求a的按位与和等于0的非空子集数. 首先由容斥可以得到 $ans = \sum \limits_{0\le x <2^{20}} (-1)^{\alpha} f_x$, 其中$\alpha$为$x$二进制中$1$的个数, $f_x$表示与和等于$x$的非空子集数. $f_x$是一个$20$维前缀和, 按传统容斥做法的话显然要超时, 可以每次求一维的和, 再累加 比方说对于2维前缀和, 用容斥的求法是这样 for (int i=1; i<=n; ++i) { for (in

Jzzhu and Numbers CodeForces - 449D (容斥,dp)

大意: 给定集合a, 求a的按位与和等于0的非空子集数. 为了方便表述, 把每个数看成一个二进制位表示的集合, 例如十进制的$10$就看做集合$\{1,3\}$. 假设给定数的范围在$[0,2^{m})$内, 记$U=\{0,1,2,\cdots,m-1\}$. 首先根据容斥可以得到 $$ans=\sum\limits_{S\subseteq 2^{U}}(-1)^{|S|}(2^{f_S}-1) \tag{1}$$ 其中$f_S=\sum\limits_{T\in a}[T\supseteq

HDU 5297 Y sequence 容斥/迭代

Y sequence Problem Description Yellowstar likes integers so much that he listed all positive integers in ascending order,but he hates those numbers which can be written as a^b (a, b are positive integers,2<=b<=r),so he removed them all.Yellowstar ca