BZOJ 3771: Triple [快速傅里叶变换 生成函数 容斥原理]
题意:n个物品,可以用1/2/3个不同的物品组成不同的价值,求每种价值有多少种方案(顺序不同算一种)
【生成函数】:
构造这么一个多项式函数g(x),使得n次项系数为a[n]。
普通型生成函数用于解决多重集的组合问题
生成函数的x无实际意义 通常可以化为一个简单的式子
组合数的生成函数 A(x)=(1+x)^n C(n,k)=a[k] 可以这么想,一次要么选择1要么选择x,选择x系数就会+1
生成函数系数为方案数,次数为价值
A(x) 选一个
B(x) A每项平方 选两个
C(x) A每项三次方 选三个
然后容斥原理算答案 听好想的看代码吧
注意计算的时候可以一直用点值,最后在再IDFT变系数表示
- #include <iostream>
- #include <cstdio>
- #include <string>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- const int N=+;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- const double PI=acos(-);
- struct Vector{
- double x,y;
- Vector(double a=,double b=):x(a),y(b){}
- };
- typedef Vector CD;
- Vector operator +(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
- Vector operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
- Vector operator *(Vector a,Vector b){return Vector(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
- Vector operator *(Vector a,double b){return Vector(a.x*b,a.y*b);}
- Vector operator /(Vector a,double b){return Vector(a.x/b,a.y/b);}
- Vector conj(Vector a){return Vector(a.x,-a.y);}
- struct FastFourierTransform{
- int n,rev[N];
- CD omega[N],omegaInv[N];
- void ini(int m){
- n=;
- while(n<m) n<<=;
- for(int k=;k<n;k++)
- omega[k]=CD(cos(*PI/n*k),sin(*PI/n*k)),
- omegaInv[k]=conj(omega[k]);
- int k=;
- while((<<k)<n) k++;
- for(int i=;i<n;i++){
- int t=;
- for(int j=;j<k;j++) if(i&(<<j)) t|=(<<(k-j-));
- rev[i]=t;
- }
- }
- void transform(CD *a,CD *omega){
- for(int i=;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
- for(int l=;l<=n;l<<=){
- int m=l>>;
- for(CD *p=a;p!=a+n;p+=l)
- for(int k=;k<m;k++){
- CD t=omega[n/l*k]*p[k+m];
- p[k+m]=p[k]-t;
- p[k]=p[k]+t;
- }
- }
- }
- void DFT(CD *a,int flag){
- if(flag==) transform(a,omega);
- else{
- transform(a,omegaInv);
- for(int i=;i<n;i++) a[i].x/=(double)n;
- }
- }
- }fft;
- int n,m,w;
- CD A[N],B[N],C[N],ans[N];
- int main(){
- freopen("in","r",stdin);
- n=read();
- for(int i=;i<=n;i++){
- w=read(); m=max(m,w);
- A[w].x=;
- B[w*].x=;
- C[w*].x=;
- }
- m=m*;
- fft.ini(m);
- fft.DFT(A,);fft.DFT(B,);fft.DFT(C,);
- for(int i=;i<fft.n;i++)
- ans[i]=ans[i]+A[i]+(A[i]*A[i]-B[i])/2.0+(A[i]*A[i]*A[i]-3.0*A[i]*B[i]+2.0*C[i])/6.0;
- fft.DFT(ans,-);
- for(int i=;i<m;i++) if(int(ans[i].x+0.5)) printf("%d %d\n",i,int(ans[i].x+0.5));
- }
BZOJ 3771: Triple [快速傅里叶变换 生成函数 容斥原理]的更多相关文章
- bzoj 3771: Triple 快速傅里叶变换 FFT
题目大意: 给出\(n\)个互不相同的物品,每个物品有价值\(x_i(x_i \leq 40000)\)如果可以从中取一个或两个或三个物品.问能够组合出来的所有价值和对应的方案数,全部输出.取值时,\ ...
- [BZOJ 3771] Triple(FFT+容斥原理+生成函数)
[BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ...
- bzoj 3771: Triple【生成函数+FFT+容斥原理】
瞎搞居然1A,真是吃鲸 n的范围只有聪明人能看见--建议读题3遍 首先看计数就想到生成函数,列出多项式A(x),然后分别考虑123 对于选一个的直接计数即可: 对于选两个的,\( A(x)^2 \), ...
- bzoj 3771 Triple FFT 生成函数+容斥
Triple Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 847 Solved: 482[Submit][Status][Discuss] Desc ...
- BZOJ 3771 Triple FFT+容斥原理
解析: 这东西其实就是指数型母函数? 所以刚开始读入的值我们都把它前面的系数置为1. 然后其实就是个多项式乘法了. 最大范围显然是读入的值中的最大值乘三,对于本题的话是12W? 用FFT优化的话,达到 ...
- BZOJ 3771: Triple(生成函数 FFT)
Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 911 Solved: 528[Submit][Status][Discuss] Description ...
- BZOJ 3771: Triple
Description 问所有三/二/一元组可能形成的组合. Sol FFT. 利用生成函数直接FFT一下,然后就是计算,计算的时候简单的容斥一下. 任意三个-3*两个相同的+2*全部相同的+任意两个 ...
- bzoj 3771 Triple——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771 把方案作为系数.值作为指数,两项相乘就是系数相乘.指数相加,符合意义. 考虑去重.先自 ...
- bzoj 3771 Triple —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771 令多项式的系数是方案数,次数是值: 设 a(x) 为一个物品的多项式,即 a[w[i] ...
随机推荐
- mybatis sql循环的使用
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...
- SVN版本库修改URL路径或者IP地址
服务器的IP地址或者URL变更,版本库服务器的IP也要修改,因为当初安装SVN URL没有使用别名,所以使用的人都要修改客户端的IP,以下是参考网上的资料. 1.Windows TortoiseSVN ...
- Sublime 安装、插件CoolFormat
http://www.sublimetext.com/3 安装Package Control https://packagecontrol.io/installation#st3 安装插件Cool F ...
- 版本控制——TortoiseSVN (1)安装与配置
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- Hadoop问题:chmod 0700 of directory /var/lib/apt/lists/
问题描述: apt-get update W: chmod of directory /: Operation not permitted) E: Could not open : Permissio ...
- vue学习笔记(二)——简单的介绍以及安装
学习编程需要的是 API+不断地练习^_^ Vue官网:https://cn.vuejs.org/ 菜鸟教程:http://www.runoob.com/vue2/vue-tutorial.html ...
- 【笔记】css 实现宽度自适应屏幕 高度自适应宽度
如果说宽高自适应屏幕尺寸那么大家可能会想到 div{ width: 100%; height: 100% } 但是如果我要自适应屏幕尺寸的同时还要变成正方形呢?(高度和宽度相等而高度不能写死) 那就要 ...
- Netty 拆包粘包和服务启动流程分析
Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你能掌握EventLoopGroup的工作流程,ServerBootstrap的启动流程,ChannelPipeline是如何操作管理Ch ...
- Vue精简版风格指南
前面的话 Vue官网的风格指南按照优先级(依次为必要.强烈推荐.推荐.谨慎使用)分类,且代码间隔较大,不易查询.本文按照类型分类,并对部分示例或解释进行缩减,是Vue风格指南的精简版 组件名称 [组件 ...
- Python的交叉编译移植至arm板
虽然网上有那么多python的交叉编译移植教程,但是方法差异蛮大,需要根据实际开发板的型号做调整,以下是适用于海思的板子移植过程. step 1. python版本从网上下就可以: step 2. 解 ...