bzoj 3027 [Ceoi2004]Sweet——生成函数
2024-10-21 16:38:13
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027
化式子到 ( \mul_{i=1}^{n}(1-x^(m[i]+1)) ) / (1-x)^n 之后就不会了。
其实把分子拿出来后的部分可以展开成一个式子,用组合意义可知 k 次项系数是 C( n-1+k,n-1 ) 。
分子的那部分可以暴搜 2^n 种可能的项!一个项 k * x^y 对答案的贡献就是 k*( \sum_{i=L-y}^{R-y}C(n-1+i,n-1) );考虑完这 2^n 种情况对答案的贡献后答案就算好了。
组合数一列的求和可以是那个右下角位置的值。
模数可能让组合数不能除,但可以把要除的 n! 乘进模数里,即 % (mod*n!) ,最后就可以把答案除以 n! 再输出了。
注意负数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,M=;
int n,m,w[N],L,R;
ll mod,ans;
void upd(ll &x){x>=mod?x-=mod:;}
ll calc(int k)
{
ll ret=;
for(int i=k+;i<=k+n;i++)
ret=ret*i%mod;
return ret;
}
void dfs(int cr,int xs,int cs)
{
if(cs>R)return;
if(cr>n)
{
ll d=calc(R-cs)+mod-(L-cs-<?:calc(L-cs-));
upd(d);
ans=(ans+xs*d)%mod;//xs may <0 so ans may <0!!!
return;
}
dfs(cr+,xs,cs);
dfs(cr+,-xs,cs+w[cr]+);
}
int main()
{
scanf("%d%d%d",&n,&L,&R);
for(int i=;i<=n;i++)scanf("%d",&w[i]);
m=;for(int i=;i<=n;i++)m*=i; mod=(ll)*m;
dfs(,,); if(ans<)ans+=mod;///
printf("%lld\n",ans/m);
return ;
}
最新文章
- MongoDB安装并设置为windows服务以使其开机自启
- spring.xml中的配置
- 栅格数据处理 RasterDataset RasterLayer Raster RasterBandCollection
- Unity 摄像机Clear Flags和Culling Mask属性用途详解
- OpenGL基础图形编程
- This Android SDK requires Android Developer Toolkit version 23.0.0 or above
- Python之路第五天,基础(5)-序列化和字符串格式化
- 本篇将记录python开发过程中常见问题
- Spring-MVC运行原理
- ImageProcessor组件
- python爬虫之git的使用(origin说明)
- 贝叶斯推断之最大后验概率(MAP)
- SCCM2012理论知识详解
- c# MVC Take的使用
- leetcode:Single Number【Python版】
- javascript事件之鼠标滚轮(mousewheel)和DOMMouseScroll事件
- winsock select 学习代码(1)
- 基于哈夫曼编码的压缩解压程序(C 语言)
- .NET反编译工具 .net Reflector_8.3.0.95 下载激活
- 将vue和element-ui写在一个html里面方便调试(小白篇)