https://www.lydsy.com/JudgeOnline/problem.php?id=3771

大意:给n把不同价值的斧子,从中选一把/两把/三把,所构成的每种价值和的可能情况有多少。

生成函数,指数为价值,系数即为可能情况数。

但是直接FFT乘会有两把/三把斧子拿的同一个的情况。

于是我们多存两个数组,分别记录两把/三把同时拿一把的生成函数,之后就容斥一下就行啦!

(注意拿的顺序不同也算是同一种情况,不要忘记除下去)

#include<cstdio>
#include<cctype>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
typedef long double dl;
const dl pi=acos(-1.0);
const int N=3e5+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct complex{//定义复数
dl x,y;
complex(dl xx=0.0,dl yy=0.0){
x=xx;y=yy;
}
complex operator +(const complex &b)const{
return complex(x+b.x,y+b.y);
}
complex operator -(const complex &b)const{
return complex(x-b.x,y-b.y);
}
complex operator *(const complex &b)const{
return complex(x*b.x-y*b.y,x*b.y+y*b.x);
}
};
void FFT(complex a[],int n,int on){
for(int i=,j=n>>;i<n-;i++){
if(i<j)swap(a[i],a[j]);
int k=n>>;
while(j>=k){j-=k;k>>=;}
if(j<k)j+=k;
}
for(int i=;i<=n;i<<=){
complex res(cos(-on**pi/i),sin(-on**pi/i));
for(int j=;j<n;j+=i){
complex w(,);
for(int k=j;k<j+i/;k++){
complex u=a[k],t=w*a[k+i/];
a[k]=u+t;
a[k+i/]=u-t;
w=w*res;
}
}
}
if(on==-)
for(int i=;i<n;i++)a[i].x/=n;
}
int n,m;
complex a[N],b[N],c[N],d[N];
int main(){
n=read();
for(int i=;i<=n;i++){
int w=read();m=max(m,w);
a[w].x=;
b[w*].x=;
c[w*].x=;
}
m=m*;
int nn=;
while(nn<m)nn<<=;
FFT(a,nn,);FFT(b,nn,);FFT(c,nn,);
for(int i=;i<nn;i++){
complex t1(1.0/2.0,);
complex t2(3.0,);
complex t3(2.0,);
complex t4(1.0/6.0,);
d[i]=d[i]+a[i];
d[i]=d[i]+(a[i]*a[i]-b[i])*t1;
d[i]=d[i]+(a[i]*a[i]*a[i]-t2*a[i]*b[i]+t3*c[i])*t4;
}
FFT(d,nn,-);
for(int i=;i<m;i++){
int w=d[i].x+0.5;
if(w)printf("%d %d\n",i,w);
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

最新文章

  1. Html 5 Web Storage
  2. Android基础总结(二)
  3. Python3基础 index 返回一个元素在列表中第一次出现的索引值
  4. 分享一下我封装iOS自定义控件的体会,附上三个好用的控件Demo &lt;时间选择器&amp;多行输入框&amp;日期选择器&gt;
  5. Javascript Regexp match and replace
  6. mac下mysql5.6字符集设置
  7. Android程序安装后在模拟器上不显示,并且控制台显示The launch will only sync the application package on the device!
  8. (转)sp_executesql介绍和使用
  9. 用Mediawiki做百科网站资源大参考
  10. 开发中常用的 $.extend 总结
  11. hdu 4057--Rescue the Rabbit(AC自动机+状压DP)
  12. Is It A Tree?
  13. TopCoder SRM500 Div1 1000 其他
  14. mysql 查询优化 ~ 善用profie利器
  15. 对请求并发数做限制的通用RequestDecorator
  16. 比Screen更好用的神器:tmux
  17. linux管道命令学习(一)
  18. V4L2规范编程--21
  19. Tribles UVA - 11021(全概率推论)
  20. iis 设置了主机名 就不能访问

热门文章

  1. DSP5509的中断学习-第4篇
  2. 微信小程序学习笔记(1)- 按钮触发的函数的定义以及不同页面之间的数据传递
  3. sql注入--高权限,load_file读写文件
  4. Navicat 导入sql脚本文件
  5. SpriteKit手机游戏摇杆JoyStick的使用 -- by iFIERO游戏开发教程
  6. Linux文件系统简介和软链接和硬链接的区别
  7. token接口的测法
  8. 数据库Mysql的学习(一)-启动和进入
  9. python函数学习之装饰器
  10. 使用树莓派实现(山寨)高清视频叠加(HDMI OSD)