记录编号 376736 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [HZOI 2015]无聊的会议V2 最终得分 100
用户昵称 Gravatarkito 是否通过 通过
代码语言 C++ 运行时间 7.337 s
提交时间 2017-02-28 06:40:49 内存使用 24.13 MiB
显示代码纯文本
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<cmath>
#include<ctime>
using namespace std;
#define	fcl	fclose(stdin);	fclose(stdout);	return 0
	#define SUBMIT 2333
const int maxn=1048576+10;
const double PI=2*acos(-1.0);
struct Complex{
	double a,b;
	Complex(){a=b=0;}
	Complex(const double& x,const double& y){a=x; b=y;}
	inline Complex operator * (const Complex& x)const{return Complex(a*x.a-b*x.b,a*x.b+b*x.a);}
	inline void operator += (const Complex& x){a+=x.a; b+=x.b;}
	inline Complex operator - (const Complex& x)const{return Complex(a-x.a,b-x.b);}
	inline void operator *= (const double& x){a*=x; b*=x;}
	inline void operator *= (const Complex& x){
		double q=a*x.a-b*x.b,p=a*x.b+b*x.a;
		a=q; b=p;
	}
}A[maxn],w,wn;
int Rev[maxn];
int ans[500010];
int n,N,K;
inline void REV(){
	for(N=1,K=0;N<(n<<1);N<<=1,++K); --K;
	for(int i=0;i<N;++i) Rev[i]=((Rev[i>>1]>>1)|((i&1)<<K));
}
int ch[500010];
inline void Read(int& x){while(x=getchar(),x<'0'||x>'9'); x-='0';}
char CH[100]; int LL;
inline void Print(int x){
	if(!x) puts("0");
	else{
		for(LL=0;x;x/=10) CH[++LL]=x%10+'0';
		for(;LL;--LL) putchar(CH[LL]);
		puts("");
	}
}
inline void FFT(Complex* Q,const int& M,const int& Ty){
	int l,i,k,c;
	for(i=0;i<M;++i) if(Rev[i]<i) swap(Q[Rev[i]],Q[i]);
	for(l=2,c=1;l<=M;c=l,l<<=1){
		wn=Complex(cos(PI*Ty/l),sin(PI*Ty/l));
		for(i=0;i<M;i+=l){
			w.a=1; w.b=0;
			for(k=i;k<(c+i);++k,w*=wn){
				Complex *y=&Q[k];
				Complex x=w*(*(y+c));  (*(y+c))=(*y)-x; (*y)+=x;
			}
		}
	}
	if(Ty==-1){
		double Inv=1.0/M;	for(int i=0;i<M;++i) Q[i]*=Inv;
	}
}
bool flag[100]={false};
int main(){
	#ifdef SUBMIT
	freopen("OXO.in","r",stdin);
	freopen("OXO.out","w",stdout);
	#endif
	scanf("%d",&n);
	for(int i=0;i<n;++i){
		Read(ch[i]);
		flag[ch[i]]=true;
	}
	REV();
	for(int k=0,i;k<5;++k){
		if(!flag[k]) continue;
		for(i=0;i<n;++i){
			if(ch[i]==k) A[i].a=1.0;
			else A[i].a=0;
			A[i].b=0;
		}
		for(i=n;i<N;++i) A[i].a=A[i].b=0;
		FFT(A,N,1);
		for(i=0;i<N;++i) A[i]*=A[i];
		FFT(A,N,-1);
		for(i=0;i<n;++i) if(ch[i]==k) ans[i]+=((A[i<<1].a-1)+0.5);
	}
	for(int i=0;i<n;++i) Print(ans[i]>>1);
	#ifndef SUBMIT
	getchar(); getchar();
	#endif
	fcl;
}