bzoj 3771 Triple —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771
令多项式的系数是方案数,次数是值;
设 a(x) 为一个物品的多项式,即 a[w[i]].x = 1,b(x) 为两个物品重复的多项式,即 b[w[i]*2].x = 1,c(x) 为三个物品重复的多项式,即 c[w[i]*3].x = 1;
选恰好三个有序物品的答案就是 a(x)^3 - 3*a(x)*b(x)^2 + c(x),因为要无序,所以再除以 3! = 6;
选恰好两个有序物品的答案就是 a(x)^2 - b(x),无序再除以 2! = 2;
再加上选一个物品的答案,也就是 c(x);
多项式也可以算乘方。
代码如下:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- typedef double db;
- int const xn=(<<);
- db const Pi=acos(-1.0);
- int n,rev[xn],lim,l,p[xn],p2[xn];
- db ans[xn];
- struct com{db x,y;}a[xn],b[xn],c[xn],t[xn];
- com operator + (com a,com b){return (com){a.x+b.x,a.y+b.y};}
- com operator - (com a,com b){return (com){a.x-b.x,a.y-b.y};}
- com operator * (com a,com b){return (com){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
- 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;
- }
- void fft(com *a,int tp)
- {
- for(int i=;i<lim;i++)
- if(i<rev[i])swap(a[i],a[rev[i]]);
- for(int mid=;mid<lim;mid<<=)
- {
- com wn=(com){cos(Pi/mid),tp*sin(Pi/mid)};
- for(int j=,len=(mid<<);j<lim;j+=len)
- {
- com w=(com){,};
- for(int k=;k<mid;k++,w=w*wn)
- {
- com x=a[j+k],y=w*a[j+mid+k];
- a[j+k]=x+y; a[j+mid+k]=x-y;
- }
- }
- }
- }
- int main()
- {
- n=rd(); int mx=;
- for(int i=,x;i<=n;i++)
- {
- x=rd(); a[x].x=b[x+x].x=c[x+x+x].x=;
- mx=max(mx,x); p[x]=p2[x+x]=;
- }
- lim=;
- while(lim<=*mx)lim<<=,l++;
- for(int i=;i<lim;i++)
- rev[i]=((rev[i>>]>>)|((i&)<<(l-)));
- fft(a,); fft(b,);
- for(int i=;i<lim;i++)t[i]=a[i]*a[i]*a[i];
- fft(t,-);
- for(int i=;i<lim;i++)ans[i]=t[i].x/lim;
- for(int i=;i<lim;i++)t[i]=a[i]*b[i];
- fft(t,-);
- for(int i=;i<lim;i++)ans[i]=(ans[i]-*(t[i].x/lim)+c[i].x)/;
- for(int i=;i<lim;i++)t[i]=a[i]*a[i];
- fft(t,-);
- for(int i=;i<lim;i++)ans[i]=(ans[i]+(t[i].x/lim-p2[i])/);
- for(int i=;i<lim;i++)ans[i]+=p[i];
- for(int i=;i<lim;i++)
- {
- if((int)(ans[i]+0.5)==)continue;
- printf("%d %d\n",i,(int)(ans[i]+0.5));
- }
- return ;
- }
bzoj 3771 Triple —— FFT的更多相关文章
- [BZOJ 3771] Triple(FFT+容斥原理+生成函数)
[BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ...
- bzoj 3771 Triple FFT 生成函数+容斥
Triple Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 847 Solved: 482[Submit][Status][Discuss] Desc ...
- bzoj 3771 Triple——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771 把方案作为系数.值作为指数,两项相乘就是系数相乘.指数相加,符合意义. 考虑去重.先自 ...
- BZOJ 3771 Triple FFT+容斥原理
解析: 这东西其实就是指数型母函数? 所以刚开始读入的值我们都把它前面的系数置为1. 然后其实就是个多项式乘法了. 最大范围显然是读入的值中的最大值乘三,对于本题的话是12W? 用FFT优化的话,达到 ...
- BZOJ 3771 Triple ——FFT
直接暴力卷积+统计就可以了. 去重比较复杂. 其实也不复杂,抄吧! 反正AC了. #include <map> #include <cmath> #include <qu ...
- BZOJ 3771: Triple(FFT+容斥)
题面 Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: "这把斧头,是不是你的?" 樵夫一看:&qu ...
- 【BZOJ 3771】 3771: Triple (FFT+容斥)
3771: Triple Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 547 Solved: 307 Description 我们讲一个悲伤的故事. ...
- BZOJ.3771.Triple(母函数 FFT 容斥)
题目链接 \(Description\) 有\(n\)个物品(斧头),每个物品价值不同且只有一件,问取出一件.两件.三件物品,所有可能得到的价值和及其方案数.\((a,b),(b,a)\)算作一种方案 ...
- BZOJ 3771: Triple(生成函数 FFT)
Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 911 Solved: 528[Submit][Status][Discuss] Description ...
随机推荐
- Nutch学习笔记二——抓取过程简析
在上篇学习笔记中http://www.cnblogs.com/huligong1234/p/3464371.html 主要记录Nutch安装及简单运行的过程. 笔记中 通过配置抓取地址http://b ...
- Why is chkconfig no longer available in Ubuntu?
Question: I can not use chkconfig tools in Ubuntu 12.10 It's a very useful tools to configure the se ...
- jdk8之永久区Permanent区参数设置分析
jdk8之永久区Permanent区参数设置分析 学习了:https://blog.csdn.net/wuhenzhangxing/article/details/78224905 jdk7中可以进行 ...
- 关于C语言中二维数组传參————————【Badboy】
直接上代码: #include void Fun(int *a[],int m,int n)// { printf("%d\t",*a);//[0][0] /* int e[2][ ...
- Django进阶之Form
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一.创建Form类 #!/usr/bin/en ...
- linux系列之-—04 自动删除n天前日志【转】
让Linux系统定时清理一些不需要的文件,日志很有必要 1. 删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; ...
- 命令+mybatis-generator插件自己主动生成Mapper映射文件
学mybatis的时候,自己写各种 *Mapper.xml和 *Mapper.java,注意各种sql语句中的 id 是否匹配.xml中的namespace是否正确,非常麻烦有木有?今天博客内容就是高 ...
- xadmin入门使用
,官方文档:http://xadmin.readthedocs.io/en/docs-chinese/views_api.html 中文文档:https://www.kancloud.cn/net_y ...
- 怎样高速编译mediatek\operator以下代码
mediatek\operator以下有单独的apk.也有overlay的数据,单独的apk会配置anroid.mk,找到相应的路径直接build. 假设是overlay,则编译原来应用的路径,比如 ...
- eclipse的debug使用(转载)
出处:http://www.blogjava.net/yxhxj2006/archive/2012/08/30/386621.html 远程Debug: http://blog.sina.com.cn ...