思路
调了半天发现ln忘了清空数组了。。。
就是这个式子\[ A^k(x) \equiv e^{k{\ln (A(x)) }} \]代码
#include#include #include using namespace std;const int MAXN = 300000;const int G = 3;const int invG = 332748118;const int MOD = 998244353;int rev[MAXN],inv_val[MAXN];int pow(int a,int b){ int ans=1; while(b){ if(b&1) ans=(1LL*ans*a)%MOD; a=(1LL*a*a)%MOD; b>>=1; } return ans;}void cal_rev(int *rev,int n,int lim){ for(int i=0;i >1]>>1)|((i&1)<<(lim-1));}void NTT(int *a,int opt,int n,int lim){ for(int i=0;i >1,midlen,midlim); static int tmp[MAXN]; while((dep<<1)>midlen) midlen<<=1,midlim++; for(int i=0;i =1;i--) a[i]=(1LL*a[i-1]*inv_val[i])%MOD; a[0]=0;}void ln(int *a,int *b,int &at){ static int tmp[MAXN]; int midlen=1,midlim=0,tmpt=at,bt=at; for(int i=0;i<=at;++i) tmp[i]=a[i]; inv(a,b,at+1,midlen,midlim); qd(tmp,tmpt); mul(b,tmp,at,tmpt); jf(b,tmpt); for(int i=0;i<=bt;i++) tmp[i]=0; for(int i=bt+1;i<=at;++i) tmp[i]=0,b[i]=0; at=bt;}void exp(int *a,int *b,int dep){ if(dep==1){ b[0]=1; return; } exp(a,b,(dep+1)>>1); static int tmp1[MAXN]; for(int i=0;i '9') c=getchar(); while(c>='0'&&c<='9'){ k=(1LL*k*10%MOD+c-'0')%MOD; c=getchar(); } for(int i=0;i