【SPOJ】Triple Sums【FFT】
来源:互联网 发布:蚁群算法处理tsp问题 编辑:程序博客网 时间:2024/05/14 12:11
传送门:【SPOJ】Triple Sums
题目分析:
首先我们不考虑
那么
然后我们考虑容斥:
然后
my code:
#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>using namespace std ;typedef long long LL ;#define clr( a , x ) memset ( a , x , sizeof a )#define cpy( a , x ) memcpy ( a , x , sizeof a )const int MAXN = 200005 ;const double pi = acos ( -1.0 ) ;struct Complex { double r , i ; Complex () {} Complex ( double r , double i ) : r ( r ) , i ( i ) {} Complex operator + ( const Complex& t ) const { return Complex ( r + t.r , i + t.i ) ; } Complex operator - ( const Complex& t ) const { return Complex ( r - t.r , i - t.i ) ; } Complex operator * ( const Complex& t ) const { return Complex ( r * t.r - i * t.i , r * t.i + i * t.r ) ; }} ;void FFT ( Complex y[] , int n , int rev ) { for ( int i = 1 , j , k , t ; i < n ; ++ i ) { for ( j = 0 , k = n >> 1 , t = i ; k ; k >>= 1 , t >>= 1 ) j = j << 1 | t & 1 ; if ( i < j ) swap ( y[i] , y[j] ) ; } for ( int s = 2 , ds = 1 ; s <= n ; ds = s , s <<= 1 ) { Complex wn ( cos ( rev * 2 * pi / s ) , sin ( rev * 2 * pi / s ) ) , w ( 1 , 0 ) , t ; for ( int k = 0 ; k < ds ; ++ k , w = w * wn ) { for ( int i = k ; i < n ; i += s ) { y[i + ds] = y[i] - ( t = w * y[i + ds] ) ; y[i] = y[i] + t ; } } } if ( rev == -1 ) for ( int i = 0 ; i < n ; ++ i ) y[i].r /= n ;}int n ;int num[MAXN] ;Complex x1[MAXN] ;Complex x2[MAXN] ;Complex x3[MAXN] ;void solve () { int x , n1 = 1 ; clr ( num , 0 ) ; for ( int i = 1 ; i <= n ; ++ i ) { scanf ( "%d" , &x ) ; num[x + 20000] ++ ; } while ( n1 <= 80000 ) n1 <<= 1 ; for ( int i = 0 ; i < n1 ; ++ i ) x1[i] = Complex ( num[i] , 0 ) ; for ( int i = 0 ; i < n1 ; ++ i ) { if ( i % 2 == 0 ) x2[i] = Complex ( num[i / 2] , 0 ) ; else x2[i] = Complex ( 0 , 0 ) ; } FFT ( x1 , n1 , 1 ) ; FFT ( x2 , n1 , 1 ) ; for ( int i = 0 ; i < n1 ; ++ i ) x3[i] = x1[i] * x1[i] * x1[i] ; for ( int i = 0 ; i < n1 ; ++ i ) x2[i] = x2[i] * x1[i] ; FFT ( x3 , n1 , -1 ) ; FFT ( x2 , n1 , -1 ) ; for ( int i = 0 ; i < n1 ; ++ i ) { LL ans = ( LL ) ( x3[i].r + 0.5 ) - 3 * ( LL ) ( x2[i].r + 0.5 ) ; if ( i % 3 == 0 ) ans += 2LL * num[i / 3] ; ans /= 6 ; if ( ans ) printf ( "%d : %lld\n" , i - 60000 , ans ) ; }}int main () { while ( ~scanf ( "%d" , &n ) ) solve () ; return 0 ;}
0 0
- 【FFT】 SPOJ Triple Sums
- 【SPOJ】Triple Sums【FFT】
- 【SPOJ】Triple Sums【FFT】
- [SPOJ TSUM] Triple Sums [FFT]
- [SPOJ TSUM]Triple Sums(FFT+生成函数+容斥原理)
- [SPOJ TSUM]Triple Sums(FFT+容斥原理)
- 【SPOJ TSUM】Triple Sums(FFT+容斥定理)
- Spoj 8372 Triple Sums
- Triple Sums(FFT 建模)
- 【bzoj3771】Triple FFT
- BZOJ 3771 Triple 母函数+FFT
- BZOJ 3771 Triple FFT+容斥原理
- [生成函数 FFT] BZOJ 3771 Triple
- [BZOJ3771]Triple(FFT+生成函数)
- [生成函数+容斥+FFT] BZOJ3771: Triple
- BZOJ 3771: Triple 母函数 FFT
- [BZOJ3771]Triple(快速傅里叶变换FFT)
- [BZOJ3771][生成函数][FFT][容斥原理]Triple
- CODE[VS] 1036 商务旅行(LCA + BFS)
- 物联网行业标准组织AllSeen Alliance成立---AllSeen AllJoyn 一回事了
- 2015年大一下第6周项目4-String类的构造
- webView loadData 中文乱码问题
- 对RFID安全机制的分析和解决方案
- 【SPOJ】Triple Sums【FFT】
- ios笔记-NSDictionary
- 第八周项目四 【炒鸡难!!高能预警!】String类的构造(重载双目运算符)
- 【J2EE浅析】——JNDI
- 一篇很全面的freemarker教程
- qtp论坛
- CGFloat、CGPoint、CGSize CGRect UIView UIWindow
- 在rails中引入bootstrap-sass
- ios笔记-NSSet