社区讨论

萌新刚学 OI 求助基础数学题

P4238【模板】多项式乘法逆参与者 7已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mkafyp15
此快照首次捕获于
2026/01/12 08:45
上个月
此快照最后确认于
2026/01/16 14:00
上个月
查看原帖
如题,感觉写的没问题啊,样例过不去
CPP
#include<bits/stdc++.h>
using namespace std;

namespace MyUsing{
 #ifndef ONLINE_JUDGE
 #define File(data) filein(data),fileout(data)
 #else
 #define File(data)  
 #endif
 #define i128 __int128 
 #define int long long
 #define for_(i,a,b) for(int i=a;i<=b;i++)
 #define _for(i,a,b) for(int i=a;i>=b;i--)
 #define endl '\n'
 #define mid(l,r) ((l+r)>>1)
 #define filein(data) freopen(data".in","r",stdin)
 #define fileout(data) freopen(data".out","w",stdout)
 inline void read(int &x){
	x=0;int f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
    x=x*f;
 }
 template<typename T,typename ...Tp> 
 inline void read(T &x,Tp &...y) {read(x),read(y...);}
} using namespace MyUsing;

namespace Poly{
    #define swap(a,b) a^=b, b^=a, a^=b
    const int N = 3e6+5, p=998244353, G=3, Gi=332748118;
    int n, m, limit = 1, L, r[N], tmp[N], G2[N];
    inline int qpow(int x,int y){
        int ans=1;
        while(y){ if(y&1) ans=ans*x%p; y>>=1; x=x*x%p;}
        return ans;
    }
    inline void NTT(int *A, int type) {
        for_(i,0,limit-1) if(i < r[i]) swap(A[i], A[r[i]]);
        for(int mid=1; mid<limit; mid<<=1) {	
            int Wn = qpow( type == 1 ? G : Gi , (p - 1) / (mid << 1));
            for(int j=0; j<limit ;j+=(mid<<1)) {
                int w = 1;
                for(int k = 0; k < mid; k++, w = (w * Wn) % p) {
                    int x = A[j + k], y = w * A[j + k + mid] % p;
                    A[j + k] = (x + y) % p,
                    A[j + k + mid] = (x - y + p) % p;
                }
            }
        }
    }
    inline void poly_Mult(int *A,int *B,int n,int m,int *G){
        while(limit <= n + m) limit <<= 1, L++;
        for_(i,0,limit-1) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (L - 1));	
        NTT(A, 1);NTT(B, 1);	
        for_(i,0,limit-1) A[i] = (A[i] * B[i]) % p;
        NTT(A, -1);	 int inv = qpow(limit,p-2);
        for_(i,0,n+m) G[i]=A[i]*inv%p;
    }
    inline void poly_inv(int *A,int n,int *G){
        G[0]=qpow(A[0],p-2);
        for(int i=1;i<2*n;i<<=1){
            for_(j,0,i/2) G2[i]=2*G[i]%p;
            limit=1,L=0; while(limit<=3*i) limit<<=1, L++;
            for_(j,0,limit-1) r[j]=(r[j>>1]>>1)|((j&1)<<L-1);
            for_(j,i/2+1,limit-1) G[j]=0;
            for_(j,0,i) tmp[j]=A[j]; for_(j,i+1,limit-1) tmp[j]=0;
            NTT(tmp,1), NTT(G,1);
            for_(j,0,limit-1) G[j]=1ll*tmp[j]*G[j]%p*G[j]%p;
            NTT(G,-1); int inv = qpow(limit,p-2); for_(j,0,limit-1) G[j]=G[j]*inv%p;
            for_(j,0,limit-1) G[j]=(G2[j]-G[j]+p)%p;
        }
    }
}
using namespace Poly;
int a[N],b[N],g[N],n,m;
signed main() {
    // File("data"); 
    int n;read(n);n--; 
    for_(i,0,n) read(a[i]),(a[i]+=p)%=p;
    poly_inv(a,n,g); for_(i,0,n) cout << g[i] << " ";
}

回复

8 条回复,欢迎继续交流。

正在加载回复...