bzoj 3771 Triple——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771
把方案作为系数、值作为指数,两项相乘就是系数相乘、指数相加,符合意义。
考虑去重。先自己卷积自己3次(就是求出点值表达式后a[ i ]=a[ i ]*a[ i ]*a[ i ],因为卷积3次就是点值的3次方,然后iDFT回去即可),这是无限制的然后把至少两个斧头相同的方案减去;刚才求的方案其实是有序的,所以两个斧头相同的话,第三个斧头有3个位置,要减去的是 a^2 * a 的3倍(a^2 * a即a的每一项的指数*2表示两个一样的斧头,然后和原来的a卷积);这时把三个斧头都一样的方案减掉了3次,一开始多算了1次,所以再加上一个a^3就行了。
再算一算一共2个斧头或一共1个斧头的即可。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #define db double
- using namespace std;
- const int N=4e4+,M=N*; const db pi=acos(-);
- int n,m,w[N],len,r[M];
- db ans[M],an2[M],an1[M];
- struct cpl{db x,y;}a[M],b[M],I;
- cpl operator+ (cpl a,cpl b){return (cpl){a.x+b.x,a.y+b.y};}
- cpl operator- (cpl a,cpl b){return (cpl){a.x-b.x,a.y-b.y};}
- cpl operator* (cpl a,cpl b){return (cpl){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
- int rdn()
- {
- int ret=;bool fx=;char ch=getchar();
- while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
- while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
- return fx?ret:-ret;
- }
- int Mx(int a,int b){return a>b?a:b;}
- void fft(cpl *a,bool fx)
- {
- for(int i=;i<len;i++)
- if(i<r[i])swap(a[i],a[r[i]]);
- for(int R=;R<=len;R<<=)
- {
- int m=R>>;
- cpl Wn=(cpl){ cos(pi/m),fx?-sin(pi/m):sin(pi/m) };
- for(int i=;i<len;i+=R)
- {
- cpl w=I;
- for(int j=;j<m;j++,w=w*Wn)
- {
- cpl tmp=w*a[i+m+j];
- a[i+m+j]=a[i+j]-tmp;
- a[i+j]=a[i+j]+tmp;
- }
- }
- }
- }
- int main()
- {
- I.x=;
- n=rdn();for(int i=;i<=n;i++)w[i]=rdn(),m=Mx(m,w[i]);
- for(int i=;i<=n;i++)
- a[w[i]].x=;
- len=;
- for(;len<=m*;len<<=);
- for(int i=;i<len;i++)r[i]=(r[i>>]>>)+((i&)?len>>:);
- fft(a,);
- for(int i=;i<len;i++)a[i]=a[i]*a[i]*a[i];
- fft(a,);
- for(int i=;i<len;i++)ans[i]=a[i].x/len,a[i].x=a[i].y=;
- for(int i=;i<=n;i++)
- a[w[i]<<].x=b[w[i]].x=;
- fft(a,); fft(b,);
- for(int i=;i<len;i++)a[i]=a[i]*b[i],b[i]=b[i]*b[i];
- fft(a,); fft(b,);
- for(int i=;i<len;i++)ans[i]-=a[i].x/len*,an2[i]=b[i].x/len;
- for(int i=;i<=n;i++)ans[w[i]*]+=,an2[w[i]<<]-=,an1[w[i]]=;
- for(int i=;i<len;i++)
- {
- ans[i]=int(ans[i]/+an2[i]/+0.5)+an1[i];
- if(ans[i])printf("%d %d\n",i,(int)ans[i]);
- }
- 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 令多项式的系数是方案数,次数是值: 设 a(x) 为一个物品的多项式,即 a[w[i] ...
- 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 ...
随机推荐
- Linux Shell基础 Bash常见命令 history、alias命令以及常用快捷键
概述 shell中常见命令history 历史纪录命令:history 命令格式如下: [root@localhost ~]# history [选项] [历史命令保存文件] -c:清空历史命令: ...
- 教你在树莓派使用上RTC实时时钟,不用再担心断电后时间归零的问题,开机后自动同步RTC时钟!!!
准备工作:1.系统建议使用官方最新的镜像文件 2.RTC时钟模块板(I2C接口)建议使用DS1307时钟模块,或者RTC时钟模块RTC时钟模块: 大家知道arduino的电平是5V,树莓派是3.3V, ...
- freeswitch中集成使用ekho实现TTS功能一
Linux下安装freeswitch并集成ekho实现TTS 1. linux下安装freeswitch就不多介绍了,具体链接网址: http://www.8000hz.com/archives/14 ...
- linux性能调分析及调优
转:https://blog.csdn.net/luokehua789789/article/details/53007456 Linux 性能分析以及调优介绍 写在前面:计算机要解决的基本问题之一是 ...
- BFC与边距重叠详解
1.什么是BFC? 在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位Box 是 CSS 布局的对象和基本单位, 直观点来说, ...
- 【Head First Servlets and JSP】笔记3:Servlet的生命周期
1.servlet的存在就是要为客户服务.servlet的任务就是得到一个用户的请求,再发回一些响应. 请求可能很复杂,也可能很简单,例如,“为我的购物车结账”,这个请求携带了一些重要的数据,你必须知 ...
- 爬虫实例之使用requests和Beautifusoup爬取糗百热门用户信息
这次主要用requests库和Beautifusoup库来实现对糗百的热门帖子的用户信息的收集,由于糗百的反爬虫不是很严格,也不需要先登录才能获取数据,所以较简单. 思路,先请求首页的热门帖子获得用户 ...
- Android电容屏(一)【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/7820492 关键词:Android 电容屏 tp ITO 平台信息:内核:linu ...
- 让FireFox支持 window.event 全局事件对象
这里比原文稍加改进,让FF也支持 event.srcElement了, 省得每次写兼容代码挺麻烦的: //For firefox window.event if(typeof(window.event ...
- php记录代码执行时间
$t1 = microtime(true); // ... 执行代码 ... $t2 = microtime(true); echo '耗时'.round($t2-$t1,3).'秒'; 简单说一下. ...