题目: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的更多相关文章

  1. [BZOJ 3771] Triple(FFT+容斥原理+生成函数)

    [BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ...

  2. bzoj 3771 Triple FFT 生成函数+容斥

    Triple Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 847  Solved: 482[Submit][Status][Discuss] Desc ...

  3. bzoj 3771 Triple —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3771 令多项式的系数是方案数,次数是值: 设 a(x) 为一个物品的多项式,即 a[w[i] ...

  4. BZOJ 3771 Triple FFT+容斥原理

    解析: 这东西其实就是指数型母函数? 所以刚开始读入的值我们都把它前面的系数置为1. 然后其实就是个多项式乘法了. 最大范围显然是读入的值中的最大值乘三,对于本题的话是12W? 用FFT优化的话,达到 ...

  5. BZOJ 3771 Triple ——FFT

    直接暴力卷积+统计就可以了. 去重比较复杂. 其实也不复杂,抄吧! 反正AC了. #include <map> #include <cmath> #include <qu ...

  6. BZOJ 3771: Triple(FFT+容斥)

    题面 Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: "这把斧头,是不是你的?" 樵夫一看:&qu ...

  7. 【BZOJ 3771】 3771: Triple (FFT+容斥)

    3771: Triple Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 547  Solved: 307 Description 我们讲一个悲伤的故事. ...

  8. BZOJ.3771.Triple(母函数 FFT 容斥)

    题目链接 \(Description\) 有\(n\)个物品(斧头),每个物品价值不同且只有一件,问取出一件.两件.三件物品,所有可能得到的价值和及其方案数.\((a,b),(b,a)\)算作一种方案 ...

  9. BZOJ 3771: Triple(生成函数 FFT)

    Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 911  Solved: 528[Submit][Status][Discuss] Description ...

随机推荐

  1. MongoDB快速入门(九)- 投影

    MongoDB投影 mongodb投影意义是只选择需要的数据,而不是选择整个一个文档的数据.如果一个文档有5个字段,只需要显示3个,只从中选择3个字段. MongoDB的find()方法,解释了Mon ...

  2. 树 List Leaves 【用数组模拟了树状结构建树+搜索叶子节点+按照特殊规律输出每个叶子节点】

    Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...

  3. echache缓存的简单使用方法

    1.需要echache的jar包 2.需要配置文件ehcache.xml和ehcache.xsd,主要是在ehcache.xml中进行配置 3.修改配置文件ehcache.xml  ,例如添加配置如下 ...

  4. 加和求不同的组合方式数目(dp)

    描述 有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式.如: n=5,5个数分别为1,2,3,4,5,t=5: 那么可能的组合有5=1+4和5=2+3和5=5三种组合方式. 输入 输入的第 ...

  5. How to use Jenkins

    一.关键点 1.how to start the build server? do i need to start some app to do this? I don't believe so... ...

  6. MapReduce-二进制输入

    Hadoop的MapReduce不只是可以处理文本信息,它还可以处理二进制格式的数据1. 关于SequenceFileInputFormat类Hadoop的顺序文件格式存储二进制的键/值对的序列.由于 ...

  7. ZigzagConvert

    public class ZigzagConvert { public static String convert(String s, int nRows) { int len = s.length( ...

  8. ubuntu安装Qt5

    1.ubuntu 10.04 desktop amd64 问题: 1.1. 没有GLIBCXX_3.4.15版本,或是更高的版本 http://blog.chinaunix.net/uid-91530 ...

  9. QMouseEvent 的坐标__Win

    1. QMouseEvent.x() 和 QMouseEvent.y() 是窗口里面的坐标,相当于 Windows API 里面的 ClientX和ClientY . 2. QMouseEvent.G ...

  10. 在openrc中从keystone V2 到 V3

    #!/bin/bash ] then echo "Usage $0 <keystone.rc>" exit fi . $ NEW_OS_AUTH_URL=`echo $ ...