小札 Combinatorics & Inclusion-Exclusion Principle 1
「codeforces - 340E」Iahub and Permutations
把 \(1,\dots,n\) 中剩下没被固定的数的数量记作 \(s\),再把这其中不担心有会填到自己身上去的情况的数字的数量记作 \(h\),则总方案为 \(s!\),考虑容斥把重叠方案去除,设容斥系数为 \(f\)。
则可以写出答案式:\(\displaystyle \sum_{i=0}^{s-h}f_i\binom{s-h}{i}(s-i)!\)。然后你考虑这个过程就是“所有数随便摆的方案数减去至少一个数冲突加上至少两个数冲突...”,所以 \(f_i=(-1)^i\)。
#include<bits/stdc++.h>
constexpr int kMod=1e9+7;
int n,a[2100],fac[2100],ifac[2100],vis[2100],bin[2100][2100];
signed main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr),std::cout.tie(nullptr);
fac[0]=1;
for(int i=1; i<=2000; ++i) fac[i]=1ll*fac[i-1]*i%kMod;
std::cin>>n;
std::vector<int> vec;
for(int i=1; i<=n; ++i) {
std::cin>>a[i];
if(~a[i]) vis[a[i]]=1;
}
bin[0][0]=1;
for(int i=1; i<=n; ++i) {
bin[i][0]=1;
for(int j=1; j<=i; ++j) bin[i][j]=(bin[i-1][j]+bin[i-1][j-1])%kMod;
}
int s=0,h=0;
for(int i=1; i<=n; ++i) {
if(a[i]==-1) s++;
if(vis[i]==0 && a[i]!=-1) h++;
}
int res=0;
for(int i=0; i<=s-h; ++i) (res+=1ll*((i&1)?-1:1)*bin[s-h][i]*fac[s-i]%kMod)%=kMod;
std::cout<<(res+kMod)%kMod<<"\n";
return 0;
}
「codeforces - 520E」Pluses everywhere
考虑每一个数位的贡献,这个取决于它右边第一个加号的位置,这个定了,它的系数就定了,即 \(10^{s}\),其中 \(s\) 为这个数位到右边第一个加号的距离减一,然后再乘一个二项式系数,当然如果这个加号在数字的最后要特殊处理。这个题是不是就做完了?
写下式子:\(\displaystyle\sum_{i=0}^{n-1}\left(\left(d_i\sum_{x=0}^{n-2-i}\cdot\binom{n-x-2}{k-1}\cdot10^{x}\right)+d_i\cdot\binom{i}{k}\cdot10^{n-i-1}\right)\),然后交换求和顺序 \(\displaystyle\left(\sum_{x=0}^{n-2}10^x\cdot\binom{n-x-2}{k-1}\cdot\sum_{i=0}^{n-x-2}d_i\right)+\left(\sum_{i=0}^{n-1}d_i\cdot\binom{i}{k}\cdot10^{n-i-1} \right)\)。
前缀和后 \(O(n)\) 算就好了。
#include<bits/stdc++.h>
constexpr int kMod=1e9+7;
int n,k,dig[100100],fac[100100],ifac[100100],pw[100100],prs[100100];
int Binpw(int x,int y) {
int res=1;
for(; y; y>>=1,x=1ll*x*x%kMod)
if(y&1) res=1ll*res*x%kMod;
return res;
}
int Bin(const int x,const int y) {
if(x<y) return 0;
return 1ll*fac[x]*ifac[x-y]%kMod*ifac[y]%kMod;
}
signed main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr),std::cout.tie(nullptr);
fac[0]=pw[0]=1;
for(int i=1; i<=100000; ++i) fac[i]=1ll*fac[i-1]*i%kMod;
for(int i=1; i<=100000; ++i) pw[i]=1ll*pw[i-1]*10%kMod;
ifac[100000]=Binpw(fac[100000],kMod-2);
for(int i=99999; ~i; --i) ifac[i]=1ll*ifac[i+1]*(i+1)%kMod;
std::cin>>n>>k;
char *grid=new char[n];
std::cin>>grid;
for(int i=0; i<n; ++i) dig[i]=grid[i]-'0';
prs[0]=dig[0];
for(int i=1; i<n; ++i) prs[i]=(prs[i-1]+dig[i])%kMod;
int res=0;
for(int i=0; i<=n-2; ++i) (res+=1ll*pw[i]*Bin(n-i-2,k-1)%kMod*prs[n-i-2]%kMod)%=kMod;
for(int i=0; i<n; ++i) (res+=1ll*dig[i]*pw[n-i-1]%kMod*Bin(i,k)%kMod)%=kMod;
std::cout<<res<<"\n";
return 0;
}
「codeforces - 451E」Devu and Flowers
你写出这个东西的 ogf:\(\displaystyle G(x)=\prod_{i=1}^n\sum_{j=0}^{f_i}x^j=\frac{\prod_{i=1}^n1-x^{f_i+1}}{(1-x)^n}=\left(\prod_{i=1}^n1-x^{f_i+1}\right)\sum_{i=0}^{\infty}\binom{n+i-1}{n-1}x^i\)。
然后发现不会了,于是考虑容斥!!.。》?
然后你发现你会了!!!。。1.!0
#include<bits/stdc++.h>
constexpr int kMod=1e9+7;
int n;
long long f[30],s;
int Binpw(int x,int y) {
int res=1;
for(; y; y>>=1,x=1ll*x*x%kMod)
if(y&1) res=1ll*res*x%kMod;
return res;
}
int Bin(long long n,const long long k) {
if(n<k) return 0;
if(n==k) return 1;
n%=kMod;
int resx=1,resy=1;
for(int i=0; i<k; ++i) {
resx=1ll*resx*(n-i)%kMod;
resy=1ll*resy*(i+1)%kMod;
}
return static_cast<int>(1ll*resx*Binpw(resy,kMod-2)%kMod);
}
signed main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr),std::cout.tie(nullptr);
std::cin>>n>>s;
for(int i=0; i<n; ++i) std::cin>>f[i];
const int kEntire=(1<<n);
int res=0;
for(int mask=0; mask<kEntire; ++mask) {
long long tp=s;
for(int j=0; j<n; ++j) {
if(mask&(1<<j)) tp-=(f[j]+1);
}
(res+=((__builtin_popcount(mask)&1)?-1ll:1ll)*Bin(tp+n-1,n-1)%kMod)%=kMod;
}
std::cout<<(res+kMod)%kMod<<"\n";
return 0;
}
小札 Combinatorics & Inclusion-Exclusion Principle 1的更多相关文章
- Inclusion–exclusion principle(动态规划)
QUESTION: 把(2, 3, 5, 7)称为primes,能被primes整除的我们称之为Walprimes,比如 -21, -30, 0, 5, 14 是, 而-121, 1, 143 etc ...
- PC端一些非经典兼容性问题小札
IE10默认在input框中输入内容后会显示一个‘X’按钮,方便删除输入的所有内容. 在password输入框显示一个眼睛的按钮,去掉叉叉和眼睛的方法如下: ::-ms-clear { display ...
- Python小札
在Python中,等号(=)是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量如: a = 123 #a是整数 print(a) a = 'ABC' #a变为字 ...
- 2016 Multi-University Training Contest 9 solutions BY 金策工业综合大学
A Poor King Tag: Reversed BFS Preprocessing is needed to calculate answers for all positions (states ...
- 抄书 Richard P. Stanley Enumerative Combinatorics Chapter 2 Sieve Methods
2.1 Inclusion-Exclusion Roughly speaking, a "sieve method" in enumerative combinatorics is ...
- 第12届北师大校赛热身赛第二场 A.不和谐的长难句1
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php? pid=17121 2014-04-25 22:59:49 不和谐的长难句1 Time Limit: ...
- BNU 26579 Andrew the Ant 【蚂蚁】
链接: http://www.bnuoj.com/bnuoj/problem_show.php?pid=26579 http://www.bnuoj.com/bnuoj/contest_show.ph ...
- BNUOJ34977夜空中最亮的星(数学,向量的应用)
夜空中最亮的星 Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name ...
- bnu 29378 Adidas vs Adivon 基础题
Adidas vs Adivon Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java ...
- bnu 4060 奇偶性,异或运算
Plants vs. Zombies Time Limit: 5000ms Memory Limit: 2048KB 64-bit integer IO format: %lld Jav ...
随机推荐
- Linux 中 3 个文件打包上传和下载相关命令详解
tar 命令 通过 SSH 访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar 命令就是必不可少的一个功能强大的工具.Linux 中最流行的tar是麻雀虽小,五脏俱全,功能强大. 使用t ...
- 【Python&GIS】判断图片中心点/经纬度点是否在某个面内
Python的exifread库可以获取图片中的源数据信息,包括经纬度.相机厂商.曝光时间.焦距.拍摄时间.拍摄地点等等信息.我们可以通过exifread库从图片中获取图片的经纬度,再通过shape ...
- 基于飞桨paddlespeech训练中文唤醒词模型
飞桨Paddlespeech中的语音唤醒是基于hey_snips数据集做的.Hey_snips数据集是英文唤醒词,对于中国人来说,最好是中文唤醒词.经过一番尝试,我发现它也能训练中文唤醒词,于是我决定 ...
- 公路堵车概率模型Python(Nagel-Schreckenberg交通流模型)
路面上有N辆车,以不同速度向前行驶,模拟堵车问题.有以下假设: 假设某辆车的当前速度是 v 如果 前方可见范围内没车,下一秒车速提高到 v+1 如果 前方有车,前车的距离为 d ,且 d < v ...
- vue3实现H5网页录音并上传(mp3、wav)兼容Android、iOS和PC端
使用 Recorder插件 可以在HTML5网页中进行录音,录音完成后得到blob文件对象,然后将blob上传到服务器:项目使用的vue3.0版本(这个插件同时支持vue2.0.也支持uniapp,很 ...
- substrate 编译出错unresolved import `sp_runtime::testing` failed to resolve: could not find `GenesisConfig` in `system`
error[E0432]: unresolved import `sp_runtime::testing` --> /Users/suyinrong/bitcoin-proj/substrate ...
- 2023-06-27:redis中什么是缓存雪崩?该如何解决?
2023-06-27:redis中什么是缓存雪崩?该如何解决? 答案2023-06-27: 缓存雪崩是指当缓存层承载大量请求并有效保护存储层时,如果缓存层由于某些原因无法提供服务,例如缓存数据大面积失 ...
- Blazor前后端框架Known-V1.2.2
V1.2.2 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. 概述 基于C#和Blazor实现的快速开发框架,前后端分离,开箱即用. 跨平台,单 ...
- C++面试八股文:如何避免死锁?
某日二师兄参加XXX科技公司的C++工程师开发岗位第31面: 面试官:什么是锁?有什么作用? 二师兄:在C++中,锁(Lock)是一种同步工具,用于保护共享资源,防止多个线程同时访问,从而避免数据竞争 ...
- Python史上最全种类数据库操作方法,你能想到的数据库类型都在里面!甚至还有云数据库!
本文将详细探讨如何在Python中连接全种类数据库以及实现相应的CRUD(创建,读取,更新,删除)操作.我们将逐一解析连接MySQL,SQL Server,Oracle,PostgreSQL,Mong ...