多项式exp求助
查看原帖
多项式exp求助
245875
Ame__楼主2020/9/8 07:18

RT,30分过不去而且还自带大常数(,不开

#define int long long

直接炸,求dalao帮忙看一看QAQ

#include<bits/stdc++.h>
    
#define LL long long
    
#define _ 0
    
using namespace std;
    
/*Grievous Lady*/
    
template <typename _n_> void read(_n_ & _x_){
    _x_ = 0;int _m_ = 1;char buf_ = getchar();
    while(buf_ < '0' || buf_ > '9'){if(buf_ == '-')_m_ =- 1;buf_ = getchar();}
    do{_x_ = _x_ * 10 + buf_ - '0';buf_ = getchar();}while(buf_ >= '0' && buf_ <= '9');_x_ *= _m_;
}
    
#define mod 998244353

#define del(x , y) \
{ \
    (x - y < 0 ? x - y + mod : x - y) \
}

#define int long long

const int kato = 5e5 + 10;

int n , a[kato] , b[kato] , c[kato] , d[kato] , f[kato] , len4;

inline int quick_pow(int a , int b){
    int res = 1;
    for(; b ; b >>= 1 , a = 1LL * a * a % mod){
        if(b & 1){
            res = 1LL * res * a % mod;
        }
    }
    return res % mod;
}

#define doit(n) \
{ \
	len4 = 1; \
    while(len4 <= 2 * n) len4 <<= 1; \
}

inline void NTT(int *y , int len , int opt){
    int *rev = new int[len];
    rev[0] = 0;
    for(int i = 1;i < len;i ++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) * (len >> 1));
    for(int i = 0;i < len;i ++) if(i < rev[i]) swap(y[i] , y[rev[i]]);
    for(int i = 1;i < len;i <<= 1){
        int g1 = quick_pow(3 , (mod - 1) / (i << 1));
        for(int j = 0;j < len;j += (i << 1)){
            for(int k = 0 , g = 1;k < i;k ++ , g = 1LL * g * g1 % mod){
                int res = 1LL * y[i + k + j] * g % mod;
                y[i + k + j] = ((y[j + k] - res) % mod + mod) % mod;
                y[j + k] = (y[j + k] + res) % mod;
            }
        }
    }
    if(opt == -1){
        reverse(y + 1 , y + len);
        for(int i = 0 , inv = quick_pow(len , mod - 2);i < len;i ++) y[i] = 1LL * y[i] * inv % mod;
    }
    delete []rev;
}

inline void poly_inv(int *a , int len){
    if(len == 1){ a[0] = quick_pow(a[0] , mod - 2); return;}
    int len1 = len / 2;
    int *g = new int[len * 2];
    for(int i = 0;i < len1;i ++) g[i] = a[i];
    for(int i = len1;i < len * 2;i ++) g[i] = 0;
    poly_inv(g , len1);
    for(int i = len1;i < len * 2;i ++) g[i] = 0;
    NTT(g , len * 2 , 1) , NTT(a , len * 2 , 1);
    for(int i = 0;i < len * 2;i ++) a[i] = ((2 * g[i] % mod - 1LL * a[i] * g[i] % mod * g[i] % mod) % mod + mod) % mod;
    NTT(a , len * 2 , -1);
    for(int i = len1;i < len * 2;i ++) a[i] = 0;
    delete []g;
}

inline void poly_mul(int *a , int *b , int len){
    doit(len);
    // while(len <= 2 * n) len <<= 1;
    NTT(a , len4 , 1) , NTT(b , len4 , 1);
    for(int i = 0;i < len4;i ++) a[i] = 1LL * (a[i] * b[i]) % mod;
    NTT(a , len4 , -1);
}

inline void poly_dev(int *a , int *b , int len){
    for(int i = 1;i < len;i ++) b[i - 1] = 1LL * i * a[i] % mod; 
    b[len - 1] = 0;
}

inline void poly_dev_inv(int *a , int *b , int len){
    for(int i = 1;i < len;i ++) b[i] = 1LL * a[i - 1] * quick_pow(i , mod - 2) % mod; 
    b[0] = 0;
}

inline void get_ln(int *a , int *b , int len){
    poly_dev(a , c , len);
    // cout << "QWQ" << '\n';
    int cnt = 1; while(cnt <= 2 * n) cnt <<= 1;
    for(int i = 0;i < n;i ++) { d[i] = a[i]; }
    poly_inv(d , cnt); poly_mul(c , d , len); poly_dev_inv(c , b , len);
    memset(c , 0 , sizeof(c)); memset(d , 0 , sizeof(d));
}

inline void exp(int *a , int *b , int len){
    if(len == 1) return (void)(b[0] = 1);
    exp(a , b , len >> 1) , get_ln(b , f , len);
    f[0] = del(a[0] + 1 , f[0]);
    for(int i = 1;i < len;i ++) f[i] = del(a[i] , f[i]);
    NTT(f , len * 2 , 1) , NTT(b , len * 2 , 1);
    for(int i = 0;i < len * 2;i ++) b[i] = 1LL * b[i] * f[i] % mod;
    NTT(b , len * 2 , -1);
    for(int i = len;i < len * 2;i ++) b[i] = 0;
}

inline int Ame_(){
    read(n);
    for(int i = 0;i < n;i ++) read(a[i]);
    // poly_inv(a , n);
    int cnt = 1; while(cnt <= 2 * n) cnt <<= 1;
    exp(a , b , cnt);
    for(int i = 0;i < n;i ++) printf("%lld " , b[i]);
    printf("\n");
    return ~~(0^_^0);
}
    
int Ame__ = Ame_();
    
signed main(){;}

/*
6
0 927384623 817976920 427326948 149643566 610586717
*/
2020/9/8 07:18
加载中...