MnZn求助多项式!
查看原帖
MnZn求助多项式!
455490
Sharpsmile楼主2022/5/15 13:52

Rt,之前写的太烂被学长怼了。后来大概按照第一篇题解的结构写了下。但是还是样例都过不了(

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#define fft(x) butterfly_shape[x]
#define int long long
using namespace std;
const int M=998244353;
const int gg=3;
const int ig=(M+1)/3;
int butterfly_shape[200300];
inline int qp(int a,int x){
    int res=a,ans=1;
    res%=M;
    while(x){
        if(x&1)ans=ans*res%M;
        res*=res;
        res%=M;
        x>>=1;
    }
    return ans;
}
inline void upd(int n){
    int l=1<<n;
    for(int i=1;i<l;i++)
        fft(i)=(fft(i>>1)>>1)|((i&1)<<(n-1));
}
struct pol{
    int f[210000];
    int len=0;
    inline void NTT(int g,int len){
        
        for(int i=0;i<len;i++)
            if(i<fft(i))swap(f[i],f[fft(i)]);
        for(int i=1;i<len;i<<=1){
            int dwg=qp(g,(M-1)/(i<<1));
            for(int st=0,le=i<<1;st<len;st+=le){
                int buf=1;
                for(int j=0;j<i;j++,buf=buf*dwg%M){
                    int a=f[st+j],b=f[st+i+j]*buf%M;
                    f[st+j]=(a+b)%M;
                    f[st+j+i]=(a-b+M)%M;
                }
            }
        }
    }
};
int n;
pol F,ANS,P;
inline void inv(int lim,pol &x){
    if(lim==1){
        ANS.f[0]=qp(x.f[0],M-2);
        
        for(int i=0;i<n;i++)
            cout<<(ANS.f[i]%M+M)%M<<" ";
        cout<<endl;
        return ;
    }
    inv((lim+1)/2,x);
    int l=0,len=1;
    while(len<(lim<<1))len<<=1,l++;
    upd(l);
    for(int i=0;i<len;i++)P.f[i]=0;
    for(int i=0;i<lim;i++)P.f[i]=x.f[i];
    P.NTT(gg,len);
    ANS.NTT(gg,len);
    for(int i=0;i<len;i++)ANS.f[i]=(2*ANS.f[i]-ANS.f[i]*ANS.f[i]%M*P.f[i]%M)%M;
    ANS.NTT(ig,len);
    for(int i=lim;i<len;i++)ANS.f[i]=0;
    
    for(int i=0;i<n;i++)
        cout<<(ANS.f[i]%M+M)%M<<" ";
    cout<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>F.f[i];
    inv(n,F);
    for(int i=0;i<n;i++)
        cout<<(ANS.f[i]%M+M)%M<<" ";
    return 0;
}

2022/5/15 13:52
加载中...