博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 3027 [Ceoi2004]Sweet——生成函数
阅读量:5817 次
发布时间:2019-06-18

本文共 1131 字,大约阅读时间需要 3 分钟。

题目:

化式子到 ( \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
#include
#include
#include
#define ll long longusing namespace std;const int N=15,M=1030;int n,m,w[N],L,R;ll mod,ans;void upd(ll &x){x>=mod?x-=mod:0;}ll calc(int k){ ll ret=1; for(int i=k+1;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-1<0?0:calc(L-cs-1)); upd(d); ans=(ans+xs*d)%mod;//xs may <0 so ans may <0!!! return; } dfs(cr+1,xs,cs); dfs(cr+1,-xs,cs+w[cr]+1);}int main(){ scanf("%d%d%d",&n,&L,&R); for(int i=1;i<=n;i++)scanf("%d",&w[i]); m=1;for(int i=1;i<=n;i++)m*=i; mod=(ll)2004*m; dfs(1,1,0); if(ans<0)ans+=mod;/// printf("%lld\n",ans/m); return 0;}

 

转载于:https://www.cnblogs.com/Narh/p/10029149.html

你可能感兴趣的文章
游戏服务器端自动更新脚本(python)
查看>>
基于IP SAN的ISCSI的存储系统
查看>>
Linux操作系统实用性解析
查看>>
以管理为轴心 为IT服务保驾护航——北京赛特百货有限公司
查看>>
Mahout学习系列之推荐算法
查看>>
如何设置IE8的WebBrowser控件(MSHTML) 的渲染模式
查看>>
[MySQL FAQ]系列 -- 如何为一个字段指定字符集
查看>>
Apache Commons DbUtils 快速上手
查看>>
nginx反向代理配置及优化
查看>>
Office 365系列之十七:配置Outlook IMAP方式连接ExchangeOnline
查看>>
KMP算法的JavaScript实现
查看>>
在Windows 7下利用笔记本的无线网卡定义热区供手机上网
查看>>
均匀的生成圆和三角形内的随机点
查看>>
循环神经网络
查看>>
linux中serial driver理解【转】
查看>>
整理sqlserver 级联更新和删除 c#调用存储过程返回值
查看>>
ios32---线程的状态
查看>>
Android总结篇系列:Activity Intent Flags及Task相关属性
查看>>
读书笔记《集体智慧编程》Chapter 9 : Advanced Classification: Kernel Methods and SVMs
查看>>
React Native填坑之旅 -- 使用react-navigation代替Navigator
查看>>