题目: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 ;
}

最新文章

  1. MongoDB安装并设置为windows服务以使其开机自启
  2. spring.xml中的配置
  3. 栅格数据处理 RasterDataset RasterLayer Raster RasterBandCollection
  4. Unity 摄像机Clear Flags和Culling Mask属性用途详解
  5. OpenGL基础图形编程
  6. This Android SDK requires Android Developer Toolkit version 23.0.0 or above
  7. Python之路第五天,基础(5)-序列化和字符串格式化
  8. 本篇将记录python开发过程中常见问题
  9. Spring-MVC运行原理
  10. ImageProcessor组件
  11. python爬虫之git的使用(origin说明)
  12. 贝叶斯推断之最大后验概率(MAP)
  13. SCCM2012理论知识详解
  14. c# MVC Take的使用
  15. leetcode:Single Number【Python版】
  16. javascript事件之鼠标滚轮(mousewheel)和DOMMouseScroll事件
  17. winsock select 学习代码(1)
  18. 基于哈夫曼编码的压缩解压程序(C 语言)
  19. .NET反编译工具 .net Reflector_8.3.0.95 下载激活
  20. 将vue和element-ui写在一个html里面方便调试(小白篇)

热门文章

  1. mysql case的语法
  2. Python自然语言处理-系列一
  3. gstreamer交叉编译
  4. 数字代币ICO
  5. mongodb中的__v字段
  6. PHP 面向对象及Mediawiki 框架分析(二)
  7. iOS_mapKit与Core Location
  8. time_t、pthread_t
  9. 斯坦福机器学习视频笔记 Week8 无监督学习:聚类与数据降维 Clusting &amp; Dimensionality Reduction
  10. Kubernetes Rook