数学专题测试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 }
View Code

相关文章:

  • 2021-10-26
  • 2021-12-13
  • 2021-11-21
  • 2021-06-11
  • 2021-12-22
  • 2021-11-30
  • 2021-06-06
猜你喜欢
  • 2022-12-23
  • 2021-12-04
  • 2022-01-21
  • 2021-11-28
  • 2021-12-04
  • 2022-03-03
  • 2021-07-18
相关资源
相似解决方案