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 ...
 
随机推荐
- 数据库自动增长id下一次的值
			
mysql SELECT auto_increment FROM information_schema.`TABLES` WHERE TABLE_SCHEMA='my_db_name' AND TAB ...
 - linux下的cacti安装(centos7)
			
1 cacti运行环境准备 cacti需要php+apache+mysql+snmp+RRDTool,以及cacti本身.cacti本体是用php开发的网站,通过snmp对远端设备信息进行采集.apa ...
 - Kubernetes Metrics-Server
			
github地址:https://github.com/kubernetes-incubator/metrics-server 官网介绍:https://kubernetes.io/docs/task ...
 - poj 1905 Expanding Rods(木杆的膨胀)【数学计算+二分枚举】
			
...
 - springmvc中url-url-pattern /和/*的区别
			
在使用springmvc时,都会在web.xml中配置一个dispatchservlet,如下: <listener> <listener-class> org.springf ...
 - 【codevs3012+codevs3037】线段覆盖4+线段覆盖5(DP)
			
线段覆盖4网址:http://codevs.cn/problem/3012/ 线段覆盖5网址:http://codevs.cn/problem/3037/ 题目大意:给出一条直线上的一坨线段,每条线段 ...
 - android.intent.category.LAUNCHER和android.intent.action.MAIN
			
一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢? 有些程序可能需要显示在程序列表里,有些不需要.怎么定义呢? android. ...
 - hive学习8(小案例1练习)
			
创建数据库 hive> create database feigu; hive> use feigu; 创建表 stg_job表 drop table if exists stg_job; ...
 - asp.net 基础知识
			
1. DropDownList 的赋值 Response.Write(DropDownList1.Items.FindByText("潍坊").Value); Response.W ...
 - centos ifcfg-eth0
			
DEVICE=eth0IPADDR=192.168.1.117NETMASK=255.255.255.0GATEWAY=192.168.1.1ONBOOT=yes