zoukankan      html  css  js  c++  java
  • luogu4238 【模板】多项式求逆

    ref

    #include <iostream>
    #include <cstdio>
    using namespace std;
    typedef long long ll;
    int n, a[270005], b[270005], c[270005], rev[270005];
    const int mod=998244353, gg=3, gi=332748118;
    int ksm(int a, int b){
    	int re=1;
    	while(b){
    		if(b&1)	re = (ll)re * a % mod;
    		a = (ll)a * a % mod;
    		b >>= 1;
    	}
    	return re;
    }
    void ntt(int a[], int lim, int opt){
    	for(int i=0; i<lim; i++)
            if(i<rev[i])
                swap(a[i], a[rev[i]]);
        for(int i=2; i<=lim; i<<=1){
            int tmp=i>>1, wn=ksm(opt==1?gg:gi, (mod-1)/i);
            for(int j=0; j<lim; j+=i){
                int w=1;
                for(int k=0; k<tmp; k++){
                    int tmp1=a[j+k], tmp2=(ll)w*a[j+k+tmp]%mod;
                    a[j+k] = (tmp1 + tmp2) % mod;
                    a[j+k+tmp] = (tmp1 - tmp2 + mod) % mod;
                    w = (ll)w * wn % mod;
                }
            }
        }
        if(opt==-1){
            int inv=ksm(lim, mod-2);
            for(int i=0; i<lim; i++)
                a[i] = (ll)a[i] * inv % mod;
        }
    }
    void work(int d, int a[], int b[]){
    	if(d==1){
    		b[0] = ksm(a[0], mod-2);
    		return ;
    	}
    	work((d+1)>>1, a, b);
    	int lim=1, limcnt=0;
    	while(lim<=d+d)	lim <<= 1, limcnt++;
    	for(int i=0; i<lim; i++)
    		rev[i] = (rev[i>>1]>>1) | ((i&1)<<(limcnt-1));
    	for(int i=0; i<d; i++)
    		c[i] = a[i];
    	for(int i=d; i<lim; i++)
    		c[i] = 0;
    	ntt(c, lim, 1);
    	ntt(b, lim, 1);
    	for(int i=0; i<lim; i++)
    		b[i] = (ll)(2 - (ll)c[i] * b[i] % mod + mod) * b[i] % mod;
    	ntt(b, lim, -1);
    	for(int i=d; i<lim; i++)
    		b[i] = 0;
    }
    int main(){
    	cin>>n;
    	for(int i=0; i<n; i++)
    		scanf("%d", &a[i]);
    	work(n, a, b);
    	for(int i=0; i<n; i++)
    		printf("%d ", b[i]);
    	printf("
    ");
    	return 0;
    }
    
  • 相关阅读:
    Lombok介绍、使用方法和总结
    Vargant centOS7安装
    Nginx
    Docker
    GOPATH
    Golang http
    /^正则表达式$/
    go: missing Git command. See https://golang.org/s/gogetcmd
    Golang 反射
    Golang 常量
  • 原文地址:https://www.cnblogs.com/poorpool/p/9151728.html
Copyright © 2011-2022 走看看