传送门 题意简述:对n个排成一排的物品涂色,有m种颜色可选. 要求相邻的物品颜色不相同,且总共恰好有K种颜色,问所有可行的方案数.(n,m≤1e9,k≤1e6n,m\le1e9,k\le1e6n,m≤1e9,k≤1e6) 思路: 容斥原理套路: 先不考虑是否选全kkk种颜色,方案数为Cmk∗k∗(k−1)n−1C_m^k*k*(k-1)^{n-1}Cmk​∗k∗(k−1)n−1. 然后枚举剩下的至少有几种颜色没选来容斥掉非法情况: 于是Ans=Cmk∑i=k1(−1)k−iCkii(i−1)n−…
传送门 题意简述:对于一个有N个元素的集合在其2^N个子集中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数. 思路:考虑枚举相交的是哪kkk个,有CnkC_n^kCnk​种方案,然后考虑剩下的可选可不选一共有22n−k2^{2^{n-k}}22n−k种选法,但是这样选出来的集合可能有其余的数相交,因此我们容斥掉多余的: ans=Cnk∗∑i=0n−kCni22n−k−ians=C_n^k*\sum_{i=0}^{n-k}C_n^i2^{2^{n-k-i}}ans=Cnk​…
传送门 题意简述:给一张图和一棵树(点数都为n≤17n \le17n≤17),问有多少种给树的标号方法方法使得图中去掉多余的边之后和树一模一样. 思路: 容斥好题啊. 考虑fi,jf_{i,j}fi,j​表示把iii对应成原图中的点jjj这棵子树的对应方案数. 然后转移就枚举儿子看能不能转,如果可以就更新当前答案. 但是这样会有多个树中的节点对应到同一个图中的节点上. 于是我们用2n2^n2n的时间去枚举可以对应的原图的点集合然后容斥即可. 代码: #include<bits/stdc++.h>…
传送门 题意简述:qqq次询问(q≤500)(q\le500)(q≤500),每次问第kkk个不被除111以外的完全平方数整除的数是多少(k≤1e9)(k\le1e9)(k≤1e9). 思路:考虑二分答案为xxx,然后用容斥原理来解决,ans=n−只有一个质数因子次数大于等于2的个数+只有2个质数因子大于等于2的个数−...ans=n-只有一个质数因子次数大于等于2的个数+只有2个质数因子大于等于2的个数-...ans=n−只有一个质数因子次数大于等于2的个数+只有2个质数因子大于等于2的个数−…
题意:有N朵花,在M种颜色中选择恰好k种不同的颜色,将这N朵花染色,要求相邻的两朵花颜色不相同. 分析:若限制改为选择不超过k种颜色将N朵花朵染色,则方案数\(f(N,k) = k*(k-1)^{N-1}\),第一朵可以在k个颜色中任意选择,第二朵可以有k-1个选择,第三朵也有k-1.... 但是f(N,k)种方案中包含了使用了少于k个颜色的方案数,要减去这些方案数.设没有使用的颜色数为i,当i=1时,减去只使用1种颜色的方案数\(C(k,1)*f(N,k-1)\);当i=2时,方案数已经被i=…
题意:给定 m 种颜色,把 n 盆花排成一直线的花涂色.要求相邻花的颜色不相同,且使用的颜色恰好是k种.问一共有几种涂色方法. 析:首先是先从 m 种颜色中选出 k 种颜色,然后下面用的容斥原理,当时没想出来,如果是只用一种颜色,那么肯定不行,如果用两种颜色,可以有这么方法, 2 * (2-1) ^ (n-1)种,如果是只用 i 种那么就是  i * (i-1) ^ (n-1).然后依次求就好.再就是求组合数的时候,由于太大,不能用递推,所以要用逆元. 代码如下: #pragma comment…
传送门 题意简述:给出n堆花,对于第j堆,有f[j]朵花,每堆花的颜色不同,现在要从中选出s朵,求方案数. 思路: 假设所有花没有上限直接插板法,现在有了上限我们用容斥扣掉多算的 状压一下再容斥:fif_ifi​表示强制集合iii中的所有堆都超过上限,其余任意的方案数,这样容斥一下就完了. 代码: #include<bits/stdc++.h> #include<tr1/unordered_map> #define ri register int using namespace s…
传送门 题意简述: 用ccc中颜色给一个n∗mn*mn∗m的方格染色,每个格子可涂可不涂,问最后每行每列都涂过色且ccc中颜色都出现过的方案数. 思路: 令fi,j,kf_{i,j,k}fi,j,k​表示至少有iii行没涂色,至少有jjj列没涂色,至少有ccc种颜色没涂色的方案数. 于是fi,j,k=CniCmjCck(c−k+1)(n−i)(m−j)f_{i,j,k}=C_n^iC_m^jC_c^k(c-k+1)^{(n-i)(m-j)}fi,j,k​=Cni​Cmj​Cck​(c−k+1)(…
传送门 题意简述:有nnn个人,mmm种物品,给出每种物品的数量aia_iai​,问每个人至少分得一个物品的方案数(n,m,每种物品数≤1000n,m,每种物品数\le1000n,m,每种物品数≤1000). 思路: 我们算出fif_ifi​表示至少有iii个人没有分到物品的方案数容斥一下即可. 于是fi=Cni∏j=1mCn−i−1+ajn−i−1f_i=C_n^i\prod_{j=1}^mC_{n-i-1+a_j}^{n-i-1}fi​=Cni​∏j=1m​Cn−i−1+aj​n−i−1​…
传送门 题意简述:有四种面值的硬币,现在qqq次询问(q≤1000)(q\le1000)(q≤1000),每次给出四种硬币的使用上限问最后刚好凑出sss块钱的方案数(s≤100000)(s\le100000)(s≤100000). 思路:先跑完全背包预处理出所有硬币都无限制时候的答案. 然后每次询问的时候枚举容斥掉多算的情况即可. 代码: #include<bits/stdc++.h> using namespace std; long long tot,c[5],d[5],s,dp[1000…