求助卡常
查看原帖
求助卡常
421265
eastcloud楼主2023/3/21 21:21
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1<<21
using namespace std;
int m,n;
int a[22][N],b[22][N];
int c[22][N];
int mod=1000000009;
inline void OR(int *f,int opt){
	for(int mid=1,R=2;R<=n;R<<=1,mid<<=1){
		for(int j=0;j<n;j+=R){
			for(int k=0;k<mid;k++){
				if(opt>0)f[j+k+mid]=f[j+k+mid]+f[j+k];
				else f[j+k+mid]=f[j+k+mid]-f[j+k];
				if(f[j+k+mid]<0)f[j+k+mid]+=mod;
				if(f[j+k+mid]>mod) f[j+k+mid]-=mod;
			}
		}
	}
}
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
inline void write(int X)
{
    if(X<0) {X=~(X-1); putchar('-');}
    if(X>9) write(X/10);
    putchar(X%10+'0');
}
int main(){
	m=read();n=(1<<m);
	for(int i=0;i<n;i++) a[__builtin_popcount(i)][i]=read();
	for(int i=0;i<n;i++) b[__builtin_popcount(i)][i]=read();
	for(int i=0;i<=m;i++){OR(a[i],1);OR(b[i],1);}
	for(int i=0;i<=m;i++){
		for(int j=0;j<=i;j++){
			for(int k=0;k<n;k++){
				c[i][k]=(c[i][k]+1ll*a[j][k]*b[i-j][k]%mod);
				if(c[i][k]>mod) c[i][k]-=mod;
			}
		}
		OR(c[i],-1);
	}
	for(int i=0;i<n;i++) {write(c[__builtin_popcount(i)][i]);putchar(' ');}
}

rt,差0.17s,怎么都调不出来了

2023/3/21 21:21
加载中...