CF755G PolandBall and Many Other Balls

题意:

标程:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int mod=998244353;
 5 const int rt=31;
 6 const int N=300005;
 7 int l,_n,pos[N],n,k,a[N],b[N],c[N],x1[N],x2[N],x3[N],x4[N],w[N],wn,inv_n;
 8 int ksm(int x,int y)
 9 {
10     int res=1;
11     while (y) {if (y&1) res=(ll)res*x%mod; x=(ll)x*x%mod; y>>=1;} 
12     return res; 
13 }
14 void init(int n)
15 {
16     l=0;
17     while ((1<<l)<=n) l++;//注意位长的处理,判断条件是(1<<l)<=n 
18     _n=1<<l;wn=ksm(rt,1<<23-l);
19     w[0]=1;inv_n=ksm(_n,mod-2);
20     for (int i=1;i<_n;i++)
21       w[i]=(ll)w[i-1]*wn%mod,pos[i]=(i&1)?pos[i-1]|(1<<(l-1)):pos[i>>1]>>1;
22 }
23 void fft(int *a,int op)
24 {
25     for (int i=0;i<_n;i++) if (i<pos[i]) swap(a[i],a[pos[i]]);
26     int len=1,id=_n;
27     for (int i=0;i<l;i++)
28     {
29       int wn=w[id>>=1];
30       for (int j=0;j<_n;j+=len*2)
31         for (int k=j,w=1;k<j+len;k++)
32         {
33              int l=a[k],r=(ll)a[k+len]*w%mod;
34              a[k]=((ll)l+r)%mod;a[k+len]=((ll)l-r+mod)%mod;
35              w=(ll)w*wn%mod;
36          }
37       len<<=1;
38     }
39     if (op==-1) {
40         reverse(a+1,a+_n);
41         for (int i=0;i<_n;i++) a[i]=(ll)a[i]*inv_n%mod; 
42     }
43 }
44 void merge(int *a,int *b,int *c)
45 {
46     c[0]=1;
47     for (int i=1;i<=k;i++) c[i]=((ll)((ll)b[i]+b[i-1])%mod+a[i-1])%mod; 
48     for (int i=k+1;i<_n;i++) c[i]=0;
49 } 
50 void solve(int n)
51 {
52     if (n==0)
53     {
54         a[0]=1;for (int i=1;i<_n;i++) a[i]=0;
55         b[0]=b[1]=1;for (int i=2;i<_n;i++) b[i]=0;
56         return;
57     }
58     if (n==1)
59     {
60         a[0]=a[1]=1;for (int i=2;i<_n;i++) a[i]=0;
61         b[0]=b[2]=1;b[1]=3;for (int i=3;i<_n;i++) b[i]=0;
62         return;
63     }
64     solve(n/2-1);
65     merge(a,b,c);
66    for (int i=k+1;i<_n;i++) a[i]=b[i]=0;
67    fft(a,1);fft(b,1);fft(c,1);
68    for (int i=0;i<_n;i++)
69    {
70        x1[i]=(ll)a[i]*a[i]%mod;
71        x2[i]=(ll)b[i]*b[i]%mod;
72        x3[i]=(ll)a[i]*b[i]%mod;
73        x4[i]=(ll)b[i]*c[i]%mod;
74     }
75     fft(x1,-1);fft(x2,-1);fft(x3,-1);fft(x4,-1);
76     for (int i=1;i<_n;i++)//从1开始,注意边界 
77       x2[i]=((ll)x2[i]+x1[i-1])%mod,x4[i]=((ll)x4[i]+x3[i-1])%mod;
78     if (n&1)
79     {
80         merge(x2,x4,b);
81         for (int i=0;i<_n;i++) a[i]=x4[i];
82     }else 
83       for (int i=0;i<_n;i++) a[i]=x2[i],b[i]=x4[i];
84 }
85 int main()
86 {
87     scanf("%d%d",&n,&k);
88     init(2*k+1); solve(n);
89     for (int i=1;i<=k;i++) printf("%d ",a[i]);
90     puts("");
91    return 0;
92 }
View Code

题解:fft+分治+dp

猜你喜欢

转载自www.cnblogs.com/Scx117/p/9158878.html