传送门

文章目录

  • 题意:
  • 思路:

题意:

思路:

注意到这个题是求若干个数的组合数,(a,b),(b,a)(a,b),(b,a)(a,b),(b,a)视为一种方案,所以我们考虑生成一个普通型生成函数。
考虑到每个数只能选一次,但是如果我们生成函数相乘的话是不能控制每个数选多少次的,可以简单脑补一下两个循环相乘,得到的结果。由于选的物品最多有三个,所以我们考虑分开讨论。
我们构造函数a(x)a(x)a(x)表示每个物品选一次,b(x)b(x)b(x)表示每个物品选两次,c(x)c(x)c(x)表示每个物品选三次。
(1)(1)(1)对于只选一个物品,答案直接为a(x)a(x)a(x)即可。
(2)(2)(2)对于选了两个物品的情况,我们如果直接计算a2(x)a^2(x)a2(x)的话会发现有重复的部分,这个重复的部分就是每个数选了两次,所以要减去b(x)b(x)b(x),由于其组合有222种,答案即为a2(x)−b(x)2\frac{a^2(x)-b(x)}{2}2a2(x)−b(x)​。
(3)(3)(3)对于选了三个物品的情况,直接计算a3(x)a^3(x)a3(x)也是有很多重复的,考虑从三个中选两个相同的位置,这个时候方案数即为(32)∗a(x)∗b(x)\binom{3}{2}*a(x)*b(x)(23​)∗a(x)∗b(x),再考虑从三个中选三个相同的位置,由于刚才已经减去了333倍的了,所以需要加上2∗c(x)2*c(x)2∗c(x)。由于各自的组合有666种,所以最终答案为a3(x)−3∗a(x)∗b(x)+2∗c(x)6\frac{a^3(x)-3*a(x)*b(x)+2*c(x)}{6}6a3(x)−3∗a(x)∗b(x)+2∗c(x)​。
直接FFTFFTFFT卷一下求答案即可。

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=10000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6,PI=acos(-1);int n,m;
int A[N],B[N],C[N];
int rev[N];
int bit,limit;struct Complex {double x,y;Complex operator + (const Complex& t) const { return {x+t.x,y+t.y}; }Complex operator - (const Complex& t) const { return {x-t.x,y-t.y}; }Complex operator * (const Complex& t) const { return {x*t.x-y*t.y,x*t.y+y*t.x}; }
}a[N],b[N],c[N],ans[N];void fft(Complex a[],int inv) {for(int i=0;i<limit;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);for(int mid=1;mid<limit;mid<<=1) {Complex w1=Complex({cos(PI/mid),inv*sin(PI/mid)});for(int i=0;i<limit;i+=mid*2) {Complex wk=Complex({1,0});for(int j=0;j<mid;j++,wk=wk*w1) {Complex x=a[i+j],y=wk*a[i+j+mid];a[i+j]=x+y; a[i+j+mid]=x-y;}}}
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);cin>>n;int mx=0;for(int i=1;i<=n;i++) {int x; scanf("%d",&x);a[x].x++; b[x*2].x++; c[x*3].x++;mx=max(mx,x*3);}while((1<<bit)<=mx) bit++;limit=1<<bit;for(int i=0;i<limit;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));fft(a,1); fft(b,1); fft(c,1);for(int i=0;i<limit;i++) {Complex x={3,0},y={2,0},z={1.0/6,0},h={1.0/2,0};ans[i]=ans[i]+(a[i]*a[i]*a[i]-x*a[i]*b[i]+y*c[i])*z;ans[i]=ans[i]+(a[i]*a[i]-b[i])*h;ans[i]=ans[i]+a[i];}fft(ans,-1);for(int i=0;i<limit;i++) {int val=(int)(ans[i].x/limit+0.5);if(val) printf("%d %d\n",i,val);}return 0;
}

#3771. Triple 生成函数 + FFT + 容斥相关推荐

  1. BZOJ 3027 Sweets 生成函数,容斥

    Description John得到了n罐糖果.不同的糖果罐,糖果的种类不同(即同一个糖果罐里的糖果种类是相同的,不同的糖果罐里的糖果的种类是不同的).第i个糖果罐里有 mi个糖果.John决定吃掉一 ...

  2. #3771. Triple(生成函数 + 容斥)

    #3771. Triple 考虑只有一个损失时,损失值的生成函数为A(x)A(x)A(x). 如果不考虑无序方案,有两个损失的生成函数为B(x)=A(x)A(x)B(x) =A(x)A(x)B(x)= ...

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

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

  4. 【BZOJ】3771: Triple FTT+生成函数

    [题意]给定n个物品,价值为$a_i$,物品价格互不相同,求选一个或两个或三个的价值为x的方案数,输出所有存在的x和对应方案数.$ai<=40000$. [算法]生成函数+FFT [题解]要求价 ...

  5. UOJ#449. 【集训队作业2018】喂鸽子 min-max容斥,FFT

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ449.html 题解 设 f(i) 表示给 i 只鸽子喂食使得至少一只鸽子被喂饱的期望次数,先 min-max容斥 一下. ...

  6. 集训队作业2018: 青春猪头少年不会梦到兔女郎学姐(多限制容斥)(生成函数)(组合数学)

    题意 给定 nnn 种颜色的球,第 iii 种颜色的球数量为 aia_iai​ 个,一种排列的贡献可以如下计算:先把这个序列首尾相连,然后把所有相邻且颜色相同的段拿出来,贡献为他们的长度之积,求所有排 ...

  7. 【集训队作业2018】青春猪头少年不会梦到兔女郎学姐(容斥)(分治FFT)

    简要题意: 给定 nnn 种颜色的球,第 iii 种颜色的球数量为 aia_iai​ 个,一种排列的贡献可以如下计算:先把这个序列首尾相连,然后把所有相邻且颜色相同的段拿出来,贡献为他们的长度之积,求 ...

  8. 【LOJ#575】【LNR#2】不等关系(容斥,动态规划,分治FFT)

    [LOJ#575][LNR#2]不等关系(容斥,动态规划,分治FFT) 题面 LOJ 题解 一个暴力\(dp\),设\(f[i][j]\)表示考虑完了前\(i\)个位置,其中最后一个数在前面所有数中排 ...

  9. 20200515省选模拟赛B、幻化成风(毒瘤容斥题+构造容斥系数+生成函数+hash状压DP+Trie树优化背包)

    题解 花了一上午+一中午终于把这道题A了 首先,我们要求的是bi互不相同的合法方案数 我们可以枚举一个a的集合S,来强制里面的b全部都相同,然后其它的随便放 由于这个题的n的约数非常多,我们可以把它质 ...

最新文章

  1. java内部类的权限符,static介绍、内部类、final、权限修饰符的作用范围,
  2. 电子管计算机的操作者是谁,大一计算机第一学期考试重点及相应习题 作者
  3. SQL基础【二、SQL语法】
  4. Sklearn参数详解—SVM
  5. Linux下SVN服务器的搭建
  6. 如何将dataset中的值赋值给datatable_金融行业实战项目:如何理解业务?
  7. python的作用域 gbel_[ python ] 全局和局部作用域变量的引用
  8. day05【后台】菜单维护
  9. Oracle如何一次插入多条数据
  10. 计算机毕设分词,基于词表的中文分词算法
  11. 计算机打字怎么学笔,学电脑·非常简单:五笔打字
  12. KEILC51的下载和安装与工程建立
  13. CleanMyMac2023免费版系统清理优化工具
  14. java有除数为零_java语言中除数为零问题
  15. STM32(RFID)阶段三(触屏数字键盘)
  16. 迷宫_随机实验_边做边学深度强化学习:PyTorch程序设计实践(1)
  17. 19秋计算机应用基础在线作业2,计算机应用基础19秋在线作业2 Windows 下能浏览并管理文件 驱动器及网络连接的强大工具是...
  18. 【NOIP模拟】行走
  19. Android 关于禁止应用截屏和录屏
  20. 论文撰写中的问题汇总

热门文章

  1. python创_Python创建Windows 服务
  2. 她13岁自己造飞机,17岁进麻省理工,3篇黑洞论文被霍金引用......
  3. 他解决了物理学千年争端,成就肩比牛顿、爱因斯坦,但却鲜有人知......
  4. WiFi密码都不会破译​还想考清华?​
  5. 你这么爱听歌,一定活得很难过吧 | 今日最佳
  6. 写好一份数据分析报告的13个要点
  7. 2018年,该转行AI工程师吗?
  8. 对5种主流编程语言的吐槽
  9. python 什么是原类_Python 什么是元类(metaclasses)?
  10. php maximum,解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示...