BZOJ 3771 生成函数,FFT
Description
Input
Output
Sample Input
4
5
6
7
Sample Output
5 1
6 1
7 1
9 1
10 1
11 2
12 1
13 1
15 1
16 1
17 1
18 1
样例解释
11有两种方案是4+7和5+6,其他损失值都有唯一方案,例如4=4,5=5,10=4+6,18=5+6+7.
HINT
所有数据满足:Ai<=40000
题意:
给出 n个物品,价值为别为Xi且各不相同,现在可以取1个、2个或3个,问每种价值和有几种情况?顺序不同算一种。
解法:
显然是个母函数,A表示每种物品取一个的情况,B表示每种物品取二个的情况,C表示每种物品取三个的情况。用指数表示价值,系数表示该价值的个数,显然多项式相乘后指数会相加,系数会相乘,很容易就求出来了。
所以对于每种物品价值x,A[x]++,B[2*x]++,C[3*x]++。
如果取1个物品,答案就是A。
如果取2个物品,A^2中有重复的(x,x)的情况,所以答案为A^2-B。
如果去3个物品,A^3中可能有(x,x,x)(x,x,y)(x,y,x)(y,x,x)这几种重复的情况,而A*B能够求出所有形容(x,x,x)和(x,y,y)的情况数。(x,x,y)(x,y,x)(y,x,x)总的情况数=(x,y,y)*3,而A*B*3又会多减去了两次(x,x,x),所以要用C加回来。所以答案为A^3-3*B*A+2C。又由于顺序不同算一种情况,因为每种物品价值都不一样,情况(2)/2,情况(3)/6。
故总情况数量等于:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 300000;
typedef long long LL;
const double PI = acos(-1.0);
typedef complex <double> Complex; void rader(Complex *y, int len) {
for(int i = 1, j = len / 2; i < len - 1; i++) {
if(i < j) swap(y[i], y[j]);
int k = len / 2;
while(j >= k) {j -= k; k /= 2;}
if(j < k) j += k;
}
}
void fft(Complex *y, int len, int op) {
rader(y, len);
for(int h = 2; h <= len; h <<= 1) {
double ang = op * 2 * PI / h;
Complex wn(cos(ang), sin(ang));
for(int j = 0; j < len; j += h) {
Complex w(1, 0);
for(int k = j; k < j + h / 2; k++) {
Complex u = y[k];
Complex t = w * y[k + h / 2];
y[k] = u + t;
y[k + h / 2] = u - t;
w = w * wn;
}
}
}
if(op == -1) for(int i = 0; i < len; i++) y[i] /= len;
} Complex a[maxn],b[maxn],c[maxn];
int n, len, x, m, mx; int main()
{
scanf("%d", &n);
for(int i=0; i<n; i++){
scanf("%d", &x);
a[x]+=(1),b[2*x]+=(1),c[3*x]+=(1);
mx = max(mx, 3*x);
}
mx++;
len = 1;
while(len < mx*2){
len <<= 1;
}
m = len+1;
fft(a, len, 1);
fft(b, len, 1);
fft(c, len, 1);
Complex t2=(2),t3=(3),t6=(6);
for (int i=0;i<len;i++)
a[i]=(a[i]*a[i]*a[i]-t3*a[i]*b[i]+t2*c[i])/t6+(a[i]*a[i]-b[i])/t2+a[i];
fft(a, len, -1);
for(int i=1; i<m; i++){
LL num = (LL)(a[i].real()+0.5);
if(num!=0) printf("%d %lld\n", i,num);
}
return 0;
}
BZOJ 3771 生成函数,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 把方案作为系数.值作为指数,两项相乘就是系数相乘.指数相加,符合意义. 考虑去重.先自 ...
- 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 ...
- loj6570 毛毛虫计数(生成函数FFT)
link 巨佬olinr的题解 <-- olinr很强 考虑生成函数 考虑直径上点数>=4的毛毛虫的直径,考虑直径中间那些节点以及他上面挂的那些点的EGF \(A(x)=\sum_{i\g ...
- BZOJ 3771: Triple(生成函数 FFT)
Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 911 Solved: 528[Submit][Status][Discuss] Description ...
随机推荐
- Android命名格式化详解
严格换行 一般情况下一个“:”一换行 建议函数的“{}”分别占一行 例:public void ooSomething() { …… } 不要用: 例:public void doSomething ...
- 【刷题】洛谷 P4329 [COCI2006-2007#1] Bond
题意翻译 有 \(n\) 个人去执行 \(n\) 个任务,每个人执行每个任务有不同的成功率,每个人只能执行一个任务,求所有任务都执行的总的成功率. 输入第一行,一个整数 \(n\) ( \(1\leq ...
- [洛谷P2511][HAOI2008]木棍分割
题目大意:有$n(n\leqslant5\times10^4)$根木棍,连续放在一起,把它们分成$m(\leqslant10^3)$段,要求使得最长的段最短,问最短的长度以及方案数 题解:要使得最长的 ...
- Linux进程间通信简介
本人仅做简介.转自:http://www.linuxidc.com/Linux/2013-06/85904p2.htm 管道( pipe ): (Linux进程间通信) 管道是一种半双工的通信 ...
- HDU.2640 Queuing (矩阵快速幂)
HDU.2640 Queuing (矩阵快速幂) 题意分析 不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值. 用F(n)表示串长为n的 ...
- HDOJ.2037 今年暑假不AC (贪心)
今年暑假不AC 点我挑战此题 题意分析 给出来n组节目的起止时间,让求出所最多能观看的完整节目个数. 贪心策略:按照节目的结束时间升序排序,比较下一项的开始时间是否比上一项的结束时间大,是的话计数器+ ...
- bzoj2058: [Usaco2010 Nov]Cow Photographs(逆序对)
题目大意:给出n个数的序列,每次可以交换相邻的两个数,问把序列变成编号i在编号i+1左边,编号1在编号n右边(一个环)最少需要多少步.如:35421最少交换两次变为34512. 一开始看到这题,只会O ...
- node egg.js使用superagent做文件转发
使用 egg.js + superagent 进行文件上传转发 // app/controller/file.js const Controller = require('egg').Controll ...
- udhcp server端源码分析1--文件组织结构
1:dhcpd.c udhcpd_main函数是整个程序的入口,依次完成的主要工作有读取配置文件信息至全局结构体.记录程序pid number.初始化lease链表.将程序作为daemon运行.死循环 ...
- C#学习之泛型功能与限制
在泛型类的描述中还会有时需要很多限制,例如对待一个泛型类型,在类中定义一个变量需要初始化时,不能确定是用Null还是0. 因为不能够确定它是值类型还是引用类型,这时可以用到default语句(下面有介 ...