请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。
标签:bbs const 等于 using closed content for ret tput
请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。
输出N行,每行一个整数,第i行输出C[i-1]。
和上题一样啊,脑补一下小结论
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 typedef complex <double> E; 5 inline int read(){ 6 int x=0;int f=1;char ch=getchar(); 7 while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} 8 while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();} 9 return x*f; 10 } 11 const int MAXN=1e6+10; 12 const double pi=acos(-1); 13 int n,m,R[MAXN],L,H; 14 E a[MAXN],b[MAXN],w[MAXN],k; 15 inline void FFT(E *a,int f){ 16 for(int i=0;i<L;i++){ 17 if(i<R[i]) swap(a[i],a[R[i]]); 18 } 19 for(int len=2;len<=L;len<<=1){ 20 int l=len>>1; 21 E wn(cos(pi/l),f*sin(pi/l)); 22 for(int i=1;i<l;i++) w[i]=w[i-1]*wn; 23 for(int st=0;st<L;st+=len){ 24 for(int k=0;k<l;k++){ 25 E x=a[st+k];E y=w[k]*a[st+k+l]; 26 a[st+k]=x+y;a[st+k+l]=x-y; 27 } 28 } 29 } 30 if(f==-1){ 31 for(int i=0;i<L;i++){ 32 a[i]/=L; 33 } 34 } 35 } 36 int main(){ 37 //freopen("All.in","r",stdin); 38 //freopen("bai.out","w",stdout); 39 n=read();w[0].real()=1; 40 for(int i=0;i<n;i++){ 41 a[i]=read();b[n-i-1]=read(); 42 } 43 L=1; 44 while(L<2*n) L<<=1,H++; 45 for(int i=0;i<L;i++){ 46 R[i]=(R[i>>1]>>1)|((i&1)<<(H-1)); 47 } 48 FFT(a,1);FFT(b,1); 49 for(int i=0;i<L;i++) a[i]=a[i]*b[i]; 50 FFT(a,-1); 51 for(int i=0;i<n;i++) printf("%d\n",int(a[i+n-1].real()+0.5)); 52 return 0; 53 }
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 freopen("All.in","w",stdout); 5 int n=rand()%10007;int m=rand()%10007; 6 cout<<n<<‘ ‘<<m<<endl; 7 for(int i=0;i<n;i++){ 8 printf("%d\n",rand()%17+2); 9 } 10 for(int i=0;i<m;i++){ 11 printf("%d\n",rand()%17+2); 12 } 13 return 0; 14 }
标签:bbs const 等于 using closed content for ret tput
原文地址:http://www.cnblogs.com/something-for-nothing/p/7894405.html