思路比较直观。设A(x)=Σxai。先把只选一种的统计进去。然后考虑选两种,这个直接A(x)自己卷起来就好了,要去掉选同一种的情况然后除以2。现在得到了选两种的每种权值的方案数,再把这个卷上A(x)。得到这个后考虑去重,其中重复的就是选了两个相同的和另外一个,那么再把选两个相同的生成函数搞出来卷上A,减掉选三个相同的。把这个东西减掉之后再除以3。说了半天也不知道在说啥,总之是容斥原理很基础的应用。

  有些卡精度,用long double才过,可能是我写丑了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define N 270000
#define double long double
const double PI=3.14159265358979324;
struct complex
{double x,y;complex operator +(const complex&a) const{return (complex){x+a.x,y+a.y};}complex operator -(const complex&a) const{return (complex){x-a.x,y-a.y};}complex operator *(const complex&a) const{return (complex){x*a.x-y*a.y,x*a.y+y*a.x};}
}w[N],v[N],u[N];
int n,m,t,a[N],r[N];
long long f[N];
void DFT(int n,complex *a,int p)
{for (int i=0;i<n;i++) if (i<r[i]) swap(a[i],a[r[i]]);for (int i=2;i<=n;i<<=1){complex wn=(complex){cos(2*PI/i),p*sin(2*PI/i)};for (int j=0;j<n;j+=i){complex w=(complex){1,0};for (int k=j;k<j+(i>>1);k++,w=w*wn){complex x=a[k],y=w*a[k+(i>>1)];a[k]=x+y,a[k+(i>>1)]=x-y;}}}
}
void mul(int n,complex *a,complex *b)
{for (int i=0;i<n;i++) r[i]=(r[i>>1]>>1)|(i&1)*(n>>1);for (int i=0;i<n;i++) a[i].y=a[i].x-b[i].x,a[i].x=a[i].x+b[i].x;DFT(n,a,1);for (int i=0;i<n;i++) a[i]=a[i]*a[i];DFT(n,a,-1);for (int i=0;i<n;i++) a[i].x=a[i].x/n/4;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj3771.in","r",stdin);freopen("bzoj3771.out","w",stdout);const char LL[]="%d %I64d\n";
#elseconst char LL[]="%d %lld\n";
#endifn=read();for (int i=1;i<=n;i++) {int x=read();m=max(m,x);w[x].x=v[x].x=f[x]=a[x]=1;}t=1;while (t<=(m<<1)) t<<=1;mul(t,w,v);for (int i=0;i<=m;i++) if (a[i]) w[i<<1].x--;for (int i=0;i<=m*2;i++) f[i]+=w[i].x=(int)(w[i].x/2+0.5);for (int i=m*2+1;i<t;i++) w[i].x=w[i].y=0;for (int i=0;i<=m;i++) v[i].x=a[i],v[i].y=0;for (int i=m+1;i<t;i++) v[i].x=v[i].y=0;t=1;while (t<=m*3) t<<=1;mul(t,w,v);for (int i=0;i<t;i++) u[i].x=(i&1)?0:a[i>>1];for (int i=0;i<=m;i++) v[i].x=a[i],v[i].y=0;for (int i=m+1;i<t;i++) v[i].x=0,v[i].y=0;mul(t,u,v);for (int i=0;i<=m;i++) if (a[i]) u[i*3].x--;for (int i=0;i<=m*3;i++) f[i]+=(long long)((w[i].x-u[i].x)/3+0.5);for (int i=0;i<=m*3;i++)if (f[i]) printf(LL,i,f[i]);return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/9451927.html

BZOJ3771 Triple(FFT+容斥原理)相关推荐

  1. 【bzoj3771】Triple FFT+容斥原理

    题目描述 樵夫的每一把斧头都有一个价值,不同斧头的价值不同.总损失就是丢掉的斧头价值和. 他想对于每个可能的总损失,计算有几种可能的方案. 注意:如果水神拿走了两把斧头a和b,(a,b)和(b,a)视 ...

  2. bzoj3771 Triple

    3771: Triple Time Limit: 20 Sec   Memory Limit: 64 MB Submit: 313   Solved: 174 [ Submit][ Status][ ...

  3. 解题报告(二)C、(darkBZOJ 3771)Triple(生成函数 + FFT + 容斥原理)(3)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  4. bzoj3771:Triple

    传送门 生成函数 设生成函数\(f(x)\),可以将系数定为选的方案数,指数定为代价 那么 \[ f(x)=\sum_{i=1}^{n}x^{w_i} \] 然后答案就是\(f^3(x)+f^2(x) ...

  5. bzoj3771: Triple

    码完这题有一种很爽很放松的感觉...155行...2.5个中午+1个早上真的值,毕竟我没mod题解啊!!! 这题一开始想的时候就想到了补0价值的斧头,然后FFT三次,结果发现有什么重复取一个啊,取的顺 ...

  6. 【AGC005F】Many Easy Problems FFT 容斥原理

    题目大意 给你一棵树,有\(n\)个点.还给你了一个整数\(k\). 设\(S\)为树上某些点的集合,定义\(f(S)\)为最小的包含\(S\)的联通子图的大小. \(n\)个点选\(k\)个点一共有 ...

  7. 【BZOJ3771】Triple

    刚学的FFT..证明好玄乎啊 根据mjs大佬的原话,FFT这种东西不需要理解,背了模板就好 先贴题 链接:BZOJ3771 Triple 题意:从n个数中选出1,2或3个数求和,询问组成每个和的方案数 ...

  8. Lucas定理:线性求所有逆元的方法

    Miskcoo's Space,版权所有丨如未注明,均为原创 转载请注明转自:http://blog.miskcoo.com/2014/09/linear-find-all-invert 主要绕过费马 ...

  9. #3771. Triple 生成函数 + FFT + 容斥

    传送门 文章目录 题意: 思路: 题意: 思路: 注意到这个题是求若干个数的组合数,(a,b),(b,a)(a,b),(b,a)(a,b),(b,a)视为一种方案,所以我们考虑生成一个普通型生成函数. ...

最新文章

  1. XML的介绍和PHP对XML的应用
  2. 多线程编程java_Java多线程编程
  3. VS2008下直接安装使用Boost库1.46.1版本号
  4. [转载] LinkedIn架构这十年
  5. Tomcat 添加为系统服务 开机自动启动
  6. Brave 浏览器宣布集成 IPFS 协议,它会取代 HTTP 吗?
  7. CUDA精进之路(零):CUDA开篇
  8. matlab2c使用c++实现matlab函数系列教程-geomean函数
  9. GO语言学习之路11
  10. 令牌桶限流-java实现
  11. spoonwep破解方式使用心得
  12. python的scrapy爬虫模块间进行传参_python网络爬虫——scrapy核心组件介绍、请求传参、下载中间件...
  13. 学生端极域课堂万能密码
  14. 智商情商哪个重要_智商情商哪个更重要 辩论赛
  15. MT1308芯片原厂
  16. Metasploit 渗透测试01-背景和功能介绍
  17. 优化巨量关键词的匹配(转载笔记)
  18. AutoJs学习-免ROOT免无障碍画圆球
  19. AXI,AXI_Lite,AXI_Stream
  20. 学计算机女生找不到男朋友,很多漂亮的女生,找不到男朋友,都躲不开这四个原因...

热门文章

  1. django之auth模块
  2. P1993 小K的农场 (差分约束)
  3. JAVA递归实现全排列
  4. [POJ2151]Check the difficulty of problems(概率DP)
  5. 北斗有 35 颗卫星,而 GPS 有 24 颗卫星,为什么二者数量不同?
  6. 使用EF Oracle实现DevExpress绑定大数据的ServerMode模式
  7. TortoiseSVN菜单项功能说明
  8. 那天有个小孩跟我说LINQ(四)
  9. Kali linux安装漏洞扫描工具Nessus安装指南
  10. 用JDBC直连方式访问SQL Server 2005详解