数学专题测试1:
T1 exLucas板子 不会就没什么好说的
T2 50pts 异或FWT板子 不会就没什么好说的
满分做法:先把原序列变成点值表达式,然后点值比较好的性质是可以直接运算。
问题等价于求$ans=\sum\limits_{i=0}^{p} x^{2^i}$,然后注意到模数很小,直接倍增就行了。
顺便放下FWT板子(
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int mod=998244353,inv=499122177; 5 int n,m,a[1<<18],b[1<<18],ta[1<<18],tb[1<<18]; 6 inline int read() { 7 int x=0;char c=getchar(),f=0; 8 for(;c>'9'||c<'0';c=getchar()) f=c=='-'; 9 for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-48; 10 return f?-x:x; 11 } 12 inline void moded(int &x) { 13 if(x<0) x+=mod; if(x>=mod) x-=mod; 14 } 15 inline void and_FWT(int *f,int *g,int opt=1) { 16 for(int i=0;i<m;++i) g[i]=f[i]; 17 for(int i=2;i<=m;i<<=1) 18 for(int st=0;st<m-1;st+=i) 19 for(int j=st;j<st+i/2;++j) 20 moded(g[j]+=g[j+i/2]*opt); 21 return ; 22 } 23 inline void or_FWT(int *f,int *g,int opt=1) { 24 for(int i=0;i<m;++i) g[i]=f[i]; 25 for(int i=2;i<=m;i<<=1) 26 for(int st=0;st<m-1;st+=i) 27 for(int j=st;j<st+i/2;++j) 28 moded(g[j+i/2]+=g[j]*opt); 29 return ; 30 } 31 inline void xor_FWT(int *f,int *g,int opt=1) { 32 for(int i=0;i<m;++i) g[i]=f[i]; 33 for(int i=2;i<=m;i<<=1) 34 for(int st=0;st<m-1;st+=i) 35 for(int j=st;j<st+i/2;++j) { 36 int u=g[j],t=g[j+i/2]; 37 if(opt) moded(g[j]=u+t),moded(g[j+i/2]=u-t); 38 else g[j]=1ll*(u+t)*inv%mod,g[j+i/2]=1ll*(u-t)*inv%mod; 39 } 40 return ; 41 } 42 int main() { 43 m=1<<(n=read()); 44 for(int i=0;i<m;++i) a[i]=read(); 45 for(int i=0;i<m;++i) b[i]=read(); 46 or_FWT(a,ta),or_FWT(b,tb); 47 for(int i=0;i<m;++i) ta[i]=1ll*ta[i]*tb[i]%mod; 48 or_FWT(ta,ta,-1); 49 for(int i=0;i<m;++i) printf("%d ",ta[i]);puts(""); 50 and_FWT(a,ta),and_FWT(b,tb); 51 for(int i=0;i<m;++i) ta[i]=1ll*ta[i]*tb[i]%mod; 52 and_FWT(ta,ta,-1); 53 for(int i=0;i<m;++i) printf("%d ",ta[i]);puts(""); 54 xor_FWT(a,ta),xor_FWT(b,tb); 55 for(int i=0;i<m;++i) ta[i]=1ll*ta[i]*tb[i]%mod; 56 xor_FWT(ta,ta,0); 57 for(int i=0;i<m;++i) printf("%d ",(ta[i]+mod)%mod); 58 return 0; 59 }