bzoj 3027 [Ceoi2004] Sweet —— 生成函数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027
就是 (1+x+x2+...+xm[i]) 乘起来;
原来想和背包一样做,然而时限很短,数组也开不了很多,本来以为勉强一下也可以,后来突然发现不行...
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=1e7+,mod=;
int n,a,b,s[xn],m;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
int main()
{
n=rd(); a=rd(); b=rd(); m=rd();
for(int i=;i<=m;i++)s[i]=i+;
for(int i=m+;i<=b;i++)s[i]=s[m];//
for(int i=;i<=n;i++)
{
m=rd();
//mx=min(mx+m[i],b);
for(int j=b;j>=;j--)//
if(j-m->=)s[j]=upt(s[j]-s[j-m-]);
for(int j=;j<=b;j++)s[j]=upt(s[j]+s[j-]);
}
int ans=s[b];
if(a)ans=upt(ans-s[a-]);
printf("%d\n",ans);
return ;
}
TLE
首先,要化简这个多项式,得到 ∏(1-xm[i]+1) / (1-x)n
可以把分子和分母分开,分母就是熟悉的 ∑ C(n+i-1,n-1)*xi
而分子一共只有 n 项,可以 2n 搜出每个系数;
然后把二者组合在一起,对于搜出的 k * xy ,对答案有贡献还需要把 xy 变成 xa ~ xb ;
所以对应分母多项式的 xa-y ~ xb-y 的系数,是连续的组合数求和,杨辉三角里的一列;
但是模数不是质数,所以组合数不好算;
参考TJ,竟然可以对组合数和模数都乘 n!,就可以 O(n) 直接乘得到组合数了,最后把答案除以 n! 即可;
如果把搜到的系数存下来,最后遍历,复杂度反而成了 O(bn) ... 不如直接在搜索里计算,有值才算上,复杂度 O(n*2n)。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=,xm=1e7+,mod=;
int n,a,b,m[xn];
ll fac,p,ans;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
ll upt(ll x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
ll C(int n,int m)
{
if(n<m)return ;//!
ll ret=;
for(int i=n-m+;i<=n;i++)ret=(ret*i)%p;
return ret;
}
void dfs(int x,int s,int t)
{
if(x==n+)
{
ans+=s*(C(n+b-t,n)-C(n+a-t-,n)); ans=ans%p;
return;
}
dfs(x+,s,t);
dfs(x+,-s,t+m[x]+);
}
int main()
{
n=rd(); a=rd(); b=rd(); fac=;
for(int i=;i<=n;i++)m[i]=rd(),fac*=i;
p=(ll)fac*mod;
dfs(,,);
/*
for(int y=0;y<=b;y++)
{
ll tmp=upt(C(n+b-y,n)-C(n+a-y-1,n));
ans=(ans+tmp*f[y])%p;
}
*/
if(ans<)ans+=p;
printf("%lld\n",ans/fac);
return ;
}
bzoj 3027 [Ceoi2004] Sweet —— 生成函数的更多相关文章
- bzoj 3027 [Ceoi2004]Sweet——生成函数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3027 化式子到 ( \mul_{i=1}^{n}(1-x^(m[i]+1)) ) / (1- ...
- bzoj 3027: [Ceoi2004]Sweet (生成函数)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3027. 题目大意:有$n$种数,每种有$C_i$个,问你在这些数中取出$[l,r]$个 ...
- bzoj 3027: [Ceoi2004]Sweet【生成函数+组合数学】
首先根据生成函数的套路,这个可以写成: \[ \prod_{i=1}^{n}(1+x^1+x^2+...+x^{c[i]}) \] 然后化简 \[ =\prod_{i=1}^{n}\frac{1-x^ ...
- BZOJ 3027: [Ceoi2004]Sweet
容斥 #include<cstdio> using namespace std; int a,b,n,m[15]; long long ans=0,mod=2004; long long ...
- 【BZOJ 3027】 3027: [Ceoi2004]Sweet (容斥原理+组合计数)
3027: [Ceoi2004]Sweet Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 71 Solved: 34 Description John ...
- [BZOJ3027][Ceoi2004]Sweet 容斥+组合数
3027: [Ceoi2004]Sweet Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 135 Solved: 66[Submit][Status] ...
- BZOJ3027 - [CEOI2004]Sweet
Portal Description 给出\(n(n\leq10),a,b(a,b\leq10^7)\)与\(\{c_n\}(c_i\leq10^6)\),求使得\(\sum_{i=1}^n x_i ...
- 2018.12.30 bzoj3027: [Ceoi2004]Sweet(生成函数+搜索)
传送门 生成函数好题. 题意简述:给出n个盒子,第iii个盒子里有mim_imi颗相同的糖(但不同盒子中的糖不相同),问有多少种选法可以从各盒子中选出数量在[a,b][a,b][a,b]之间的糖果. ...
- BZOJ 3027 Sweets 生成函数,容斥
Description John得到了n罐糖果.不同的糖果罐,糖果的种类不同(即同一个糖果罐里的糖果种类是相同的,不同的糖果罐里的糖果的种类是不同的).第i个糖果罐里有 mi个糖果.John决定吃掉一 ...
随机推荐
- 转: 多版本并发控制(MVCC)在分布式系统中的应用 (from coolshell)
from: http://coolshell.cn/articles/6790.html 问题 最近项目中遇到了一个分布式系统的并发控制问题.该问题可以抽象为:某分布式系统由一个数据中心D和若干业务 ...
- Chrome内核保存为mhtml(单网页)
在地址栏输入:chrome://flags 回车 然后Ctrl+f查找mhtml Tips: 如果网页图片看不太清可以CTRL+鼠标滚轮放大网页 如果系统原因以及其它因素可以下载:QQ浏览器(默认保 ...
- vs升级c++项目遇到的一些问题
1.error C1189: #error : This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x ...
- UE-9260使用说明2
生成镜像 1. U-boot 生成u-boot.bin文件 (1) Makefile ifeq ($(ARCH),arm) CROSS_COMPILE = endif 改动为 ifeq ($(ARCH ...
- 笔记11 export to excel
参考两篇博客:http://blog.csdn.net/zyming0815/article/details/5939104 http://blog.csdn.net/g710710/article/ ...
- cuda9,cuda8分享百度云下载
一.文件名称: md5-cuda9cuda-repo-ubuntu1704-9-0-local_9.0.176-1_amd64.debcuda-repo-ubuntu1604-9-0-local_9. ...
- JavaScript读书笔记(1)
从今天开启每天看书记笔记模式,<JavaScript高级程序设计(第3版)> 1. Javascript最初是为了解决输入验证器的问题,现在已经发展成一门复杂的语言: 2. 语言标准为E ...
- SDP, RTP, RTCP, RTSP, RTMP 名词解释
读维基百科里的词条,记录的一点笔记. SDP 会话描述协议 Session Description Protocol 严格来说 SDP 不是一种协议,而是一种格式约定,用于描述流媒体的参数.如协商媒体 ...
- Android API Guides---NFC Basics
本文档介绍了Android中运行基本任务NFC. 它说明了怎样在NDEF消息的形式发送和接收数据的NFC并介绍了支持这些功能的Android框架的API. 对于更高级的主题.包含与非NDEF数据工 ...
- dsoframer注冊说明及在VC2010使用
一.dsoframer在XP.win7和win8中的注冊方法. 从微软站点下载DsoFrmaer_KB311765_x86.exe,双击解开后得到的dsoframer.ocx等文件. (一)XP注冊 ...