spoj-TSUM Triple Sums
题解:
很吊的容斥+$FFT$,但是并不难。
首先,由于有重复,我们要容斥。
怎么办?
记录三个多项式,
只取一个:$w1$;
相同物体拿两个:$w2$;
相同物体拿三个:$w3$;
然后答案能推出来是$(w1*w1*w1-3*w1*w2+2*w3)/6$;
然后$FFT$瞎搞就行了。
注意有负数,同时扩大再瞎搞。
代码:
- #include<cmath>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- #define N 300000
- #define ll long long
- const double Pi = acos(-1.0);
- template<typename T>
- inline void read(T&x)
- {
- T f=,c=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
- x = f*c;
- }
- struct cp
- {
- double x,y;
- cp(){}
- cp(double x,double y):x(x),y(y){}
- cp operator + (const cp &a)const{return cp(x+a.x,y+a.y);}
- cp operator - (const cp &a)const{return cp(x-a.x,y-a.y);}
- cp operator * (const cp &a)const{return cp(x*a.x-y*a.y,x*a.y+y*a.x);}
- };
- int to[N];
- void fft(cp *a,int len,int k)
- {
- for(int i=;i<len;i++)
- if(i<to[i])swap(a[i],a[to[i]]);
- for(int i=;i<len;i<<=)
- {
- cp w0(cos(Pi/i),k*sin(Pi/i));
- for(int j=;j<len;j+=(i<<))
- {
- cp w(,);
- for(int o=;o<i;o++,w=w*w0)
- {
- cp w1 = a[j+o],w2 = w*a[j+o+i];
- a[j+o] = w1+w2;
- a[j+o+i] = w1-w2;
- }
- }
- }
- if(k==-)
- for(int i=;i<len;i++)
- a[i].x=(ll)round(a[i].x/len+0.1);
- }
- int n,a[N],lim=,l;
- cp w1[N],w2[N],w3[N],w4[N],w5[N];
- int main()
- {
- // freopen("tt.in","r",stdin);
- read(n);
- for(int i=;i<=n;i++)
- {
- read(a[i]);
- a[i]+=;
- }
- while(lim<)lim<<=,l++;
- for(int i=;i<lim;i++)to[i]=((to[i>>]>>)|((i&)<<(l-)));
- for(int i=;i<=n;i++)
- {
- w1[a[i]].x++;
- w2[a[i]*].x++;
- w3[a[i]*].x++;
- }
- fft(w1,lim,),fft(w2,lim,);
- for(int i=;i<lim;i++)
- {
- w4[i] = w1[i]*w1[i]*w1[i];
- w5[i] = w1[i]*w2[i];
- }
- fft(w4,lim,-),fft(w5,lim,-);
- for(int i=;i<=;i++)
- {
- ll tmp = (ll)(w4[i].x-*w5[i].x+*w3[i].x+0.1)/;
- if(tmp)
- printf("%d : %lld\n",i-,tmp);
- }
- return ;
- }
spoj-TSUM Triple Sums的更多相关文章
- SPOJ TSUM Triple Sums(FFT + 容斥)
题目 Source http://www.spoj.com/problems/TSUM/ Description You're given a sequence s of N distinct int ...
- spoj TSUM - Triple Sums fft+容斥
题目链接 首先忽略 i < j < k这个条件.那么我们构造多项式$$A(x) = \sum_{1现在我们考虑容斥:1. $ (\sum_{}x)^3 = \sum_{}x^3 + 3\s ...
- SPOJ:Triple Sums(母函数+FFT)
You're given a sequence s of N distinct integers.Consider all the possible sums of three integers fr ...
- Spoj 8372 Triple Sums
题意:给你n个数字,对于任意s,s满足\(s=u_i+u_j+u_k,i<j<k\),要求出所有的s和对应满足条件的i,j,k的方案数 Solution: 构造一个函数:\(A(x)=\s ...
- 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 Triple Sums(FFT+容斥原理)
# include <cstdio> # include <cstring> # include <cstdlib> # include <iostream& ...
- SPOJ - Triple Sums
[传送门] FFT第一题! 构造多项式 $A(x) = \sum x ^ {s_i}$. 不考虑题目中 $i < j < k$ 的条件,那么 $A^3(x)$ 每一项对应的系数就是答案了. ...
- SPOJ - TSUM 母函数+FFT+容斥
题意:n个数,任取三个加起来,问每个可能的结果的方案数. 题解:构造母函数ABC,比如现在有 1 2 3 三个数.则 其中B表示同一个数加两次,C表示用三次.然后考虑去重. A^3表示可重复地拿三个. ...
- [SP8372-TSUM]Triple Sums
题面在这里 description 某\(B\)姓\(OJ\)权限题 给出\(n\)个正整数\(a[i]\),求\(i<j<k\)且\(S=a[i]+a[j]+a[k]\)的三元组\((i ...
随机推荐
- Codeforces 550B 【暴力】
题意: 有n个数字, 要求在这n个数中选出至少两个数字, 使得它们的和在L,R之间,并且最大的与最小的差值要不小于x 思路: 撒比了啊... 根据状态的话一共也就是2^15-直接暴力,二进制的小魅力还 ...
- lightoj 1125【01背包变性】
题意: 从n个数里选出m个来,还要使得这m个数之和被d整除. 给一个n和q,再给n个数,再给q个询问,每个询问包含两个数,d,m; 对于每个case输出每个q个询问的可行的方案数. 思路: 每个数只能 ...
- Codeforces732F Tourist Reform
求出无向图的所有边双联通分量,然后缩点就成了一颗树. 然后我们选取最大的那个边双联通分量作为根,这样我们就可以确定所有割边的方向了. 对于边双联通分量里面的边,我们随便dfs一下就可以把它变成强连通分 ...
- redis 发布订阅实现异步实时发短信
redis 中发布和订阅可以实现消息的实时传输,这里我只是用它的事件驱动,当客户端发送了消息,服务器端立马可以接收指令处理相应的业务逻辑. 客户端 client.php <?php //发布 $ ...
- PKI体系下的 SSL TLS HTTPS 详解
背景: SSL(Secure Socket Layer 安全套接层)是一个加密函数库,它可以将应用层上所有明文传输的数据,通过调用SSL库,即可摇身一变成为安全通信连接,SSL最初是由网景公司(Net ...
- hdu1272 小希的迷宫 基础并查集
#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> ...
- php.ini配置文件位置
laravel之今天遇到个意想不到的问题: 我在测试文件上传,大于2M的文件时候hasFile() 方法报错,这一定是文件大小限制.接下来就跳坑了 1.首先查找php.ini的位置,就用find / ...
- bzoj 4456 [Zjoi2016]旅行者
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4456 题解 分治 设当前work的区间为(x1,y1,x2,y2) 我们将长边分成两半 不妨 ...
- BZOJ4653(区间离散化+线段树+决策单调尺取)
写得很好的题解 一眼过去很像是:排序,然后从前向后扫,有这个区间时插到树里,过去以后再删除.然后事实也是这样做的…… 具体起来: 1.如果考虑暴力的话,一种想法是枚举左端和右端要选取的区间(如果我们按 ...
- android draw9patch工具使用
1.作用 将图片制作android .9图片xxx.9.png xxx.9.jpg xxx.9.gif 这些图片在android上拉伸时,边角不变形,不影响效果. 2.工具位置 Android的S ...