求多项式逆元查错
查看原帖
求多项式逆元查错
114914
一只书虫仔楼主2020/7/1 15:52

rt,样例不会过@FZzzz

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<iostream>
#include<algorithm> 
#include<queue>
#include<cmath>
#include<cstdio>
#define G 3
#define mod 998244353
#define ll long long
#define inf 2147098934832ll
using namespace std;
ll read(){ll ans=0,f=1;char a=getchar();while(a>'9'||a<'0'){if(a=='-')f=-1;a=getchar();}while(a>='0'&&a<='9')ans=(ans<<3)+(ans<<1)+a-'0',a=getchar();return ans*f;}
const int maxn = 3000005;
const double pi = acos(-1);
ll n,m,rev[maxn],f[maxn],g[maxn],h[maxn];
ll qpow(ll a,ll base=mod-2)
{
	ll ans=1;
	while(base){
		if(base&1)ans=ans*a%mod;
		a=a*a%mod;
		base>>=1;
	}
	return ans;
}
const ll invg=qpow(G);
void fast_fast_tle(ll limit,ll *a,bool type){ 
	ll sb=log2(limit);
	for(int i=0;i<limit;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(sb-1));
	for(int i=0;i<limit;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
	for(int p=2;p<=limit;p<<=1){
		ll len=p>>1;
		ll wm=qpow(type?G:invg,(mod-1)/p);
		for(int k=0;k<limit;k+=p){
			ll w=1;
			for(int l=k;l<k+len;l++){
				ll t=w*a[l+len]%mod;
				a[l+len]=(a[l]-t+mod)%mod;
				a[l]=(a[l]+t)%mod;
				w=w*wm%mod;
			}
		}
	}
}
void NTT(ll *f,ll *g,ll limit,ll *get){
	fast_fast_tle(limit,f,1);fast_fast_tle(limit,g,1);
	for(int i=0;i<=limit;i++)get[i]=f[i]*g[i]%mod;
	fast_fast_tle(limit,get,0);
	ll invl=qpow(limit);
	for(int i=0;i<=limit;i++)get[i]=get[i]*invl%mod;
}
void inv(ll *f,ll limit,ll *get){
	if(limit==1){get[0]=qpow(f[0],mod-2);return;}
	inv(f,(limit+1)>>1,get);
	ll lbw=1;while(lbw<(limit<<1))lbw*=2;
	for(int i=0;i<limit;i++)h[i]=f[i];
	for(int i=limit;i<lbw;i++)h[i]=0;
	fast_fast_tle(lbw,h,1);fast_fast_tle(lbw,get,1);
	for(int i=0;i<lbw;i++)get[i]=((2*get[i]%mod)-(get[i]*get[i]%mod*h[i]%mod)+mod)%mod;
	fast_fast_tle(lbw,get,0);
	for(int i=limit;i<lbw;i++)get[i]=0;
}
int main(){
    n=read();
    for(int i=0;i<n;i++)f[i]=read();
    inv(f,n,g);
    for(int i=0;i<n;i++)cout<<g[i]<<' ';
	return 0;
}
2020/7/1 15:52
加载中...