SPOJ Triple Sums(FFT+容斥原理)


# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <complex>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
const double pi=acos(-1.0);
# define eps 1e-
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FDR(i,a,n) for(int i=a; i>=n; --i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
inline int Scan() {
int x=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
}
inline void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
}
const int N=;
//Code begin.... typedef complex<double> cmx;
int c[N<<], val[N<<], a[N<<], b[N<<];
cmx x[N<<], y[N<<]; void change(cmx x[], int len) {
int i, j, k;
for(i=, j=len>>; i<len-; ++i) {
if(i<j) swap(x[i],x[j]);
k=len>>;
while(j>=k) j-=k, k>>=;
if(j<k) j+=k;
}
}
void fft(cmx x[], int len, int on) {
change(x,len);
for(int i=; i<=len; i<<=) {
cmx wn(cos(-on**pi/i),sin(-on**pi/i));
for(int j=; j<len; j+=i) {
cmx w(,);
FOR(k,j,j+i/-) {
cmx u=x[k], v=x[k+i/]*w;
x[k]=u+v; x[k+i/]=u-v; w*=wn;
}
}
}
if(on==-) FOR(i,,len-) x[i]/=len;
}
int main()
{
int n, maxx=;
cmx three(3.0,);
scanf("%d",&n);
FOR(i,,n) scanf("%d",val+i), val[i]+=, maxx=max(maxx,val[i]);
maxx*=;
FOR(i,,n) ++a[val[i]], ++b[val[i]*], ++c[val[i]*];
int len=;
while(len<maxx) len<<=; //len要为2的幂次
FOR(i,,len-) x[i]=cmx(a[i],), y[i]=cmx(b[i],);
fft(x,len,); fft(y,len,); //将系数表达式转化为点值表达式
FOR(i,,len-) x[i]=x[i]*x[i]*x[i]-x[i]*y[i]*three;
fft(x,len,-);
FOR(i,,len-) a[i]=(int(x[i].real()+0.5)+*c[i])/;
FOR(i,,len-) {
if(!a[i]) continue;
printf("%d : %d\n", i-*,a[i]);
}
return ;
}
SPOJ Triple Sums(FFT+容斥原理)的更多相关文章
- 2018.11.18 spoj Triple Sums(容斥原理+fft)
		
传送门 这次fftfftfft乱搞居然没有被卡常? 题目简述:给你nnn个数,每三个数ai,aj,ak(i<j<k)a_i,a_j,a_k(i<j<k)ai,aj,ak( ...
 - spoj TSUM - Triple Sums   fft+容斥
		
题目链接 首先忽略 i < j < k这个条件.那么我们构造多项式$$A(x) = \sum_{1现在我们考虑容斥:1. $ (\sum_{}x)^3 = \sum_{}x^3 + 3\s ...
 - 【BZOJ3771】Triple 生成函数 FFT 容斥原理
		
题目大意 有\(n\)把斧头,不同斧头的价值都不同且都是\([0,m]\)的整数.你可以选\(1\)~\(3\)把斧头,总价值为这三把斧头的价值之和.请你对于每种可能的总价值,求出有多少种选择方案. ...
 - BZOJ3771 Triple(FFT+容斥原理)
		
思路比较直观.设A(x)=Σxai.先把只选一种的统计进去.然后考虑选两种,这个直接A(x)自己卷起来就好了,要去掉选同一种的情况然后除以2.现在得到了选两种的每种权值的方案数,再把这个卷上A(x). ...
 - SPOJ - Triple Sums
		
[传送门] FFT第一题! 构造多项式 $A(x) = \sum x ^ {s_i}$. 不考虑题目中 $i < j < k$ 的条件,那么 $A^3(x)$ 每一项对应的系数就是答案了. ...
 - 【bzoj3771】Triple  FFT+容斥原理
		
题目描述 樵夫的每一把斧头都有一个价值,不同斧头的价值不同.总损失就是丢掉的斧头价值和. 他想对于每个可能的总损失,计算有几种可能的方案. 注意:如果水神拿走了两把斧头a和b,(a,b)和(b,a)视 ...
 - The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力)
		
The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力) 传送门:https://nanti.jisuanke.com/ ...
 - SPOJ TSUM Triple Sums(FFT + 容斥)
		
题目 Source http://www.spoj.com/problems/TSUM/ Description You're given a sequence s of N distinct int ...
 - SPOJ:Triple Sums(母函数+FFT)
		
You're given a sequence s of N distinct integers.Consider all the possible sums of three integers fr ...
 
随机推荐
- Closure Compiler应用程序使用入门[译]
			
Hello World示例 Closure Compiler应用程序是一个Java 命令行工具,用来对JavaScript代码进行压缩.优化和排错.按照下面的步骤,用一个简单的JavaScript程序 ...
 - Node JS World
			
Node JS World Environment tested on Ubuntu Install nvm/node/npm/yarn nvm : node version manager node ...
 - JAVA的关键特性
			
Java团队对设计Java时的关键考虑因素进行了总结,关键特性包含以下列表: 简单性 安全性 可移植性 面向对象 健壮性 多线程 体系结构中立 解释执行 高性能 分布式 动态性 简单性 Java的设计 ...
 - centos7安装vim以及在vim中显示中文
			
1.centos7安装vim yum -y install vim(简单粗暴安装方法) 2.在vim中显示中文不出现乱码 (1).vim ~/.vimrc (~/.vimrc为vim配置文件) (2) ...
 - Unity Shader 学习之旅之SurfaceShader
			
Unity Shader 学习之旅之SurfaceShader unity shader 图形图像 如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...
 - mac上搭建appium+IOS自动化测试环境(二)
			
上一篇: mac上搭建appium+IOS自动化测试环境(一) 9.安装appium-xcuitest-driver依赖 进入WebDriverAgent安装目录,运行bootstrap 首先进入目录 ...
 - pytorch中的Linear Layer(线性层)
			
LINEAR LAYERS Linear Examples: >>> m = nn.Linear(20, 30) >>> input = torch.randn(1 ...
 - ossec代理
			
代理端 OSSEC有两种代理端:可安装的代理端和哑代理端(免安装).可安装的代理端被安装在主机上,通过OSSEC的加密协议将主机的信息发送到OSSEC服务器.亚代理端则不需在远端主机进行安装.他作为O ...
 - Linux下端口映射工具rinetd
			
Linux下简单好用的工具rinetd,实现端口映射/转发/重定向官网地址http://www.boutell.com/rinetd 软件下载wget http://www.boutell.com/r ...
 - Django_用户权限管理rbac
			
组成部分 1.初始化权限:login视图initial_permission,把权限信息放入session.initial_permission函数生成权限列表.菜单列表 2.中间件验证权限:在第一次 ...