求助
查看原帖
求助
245875
Ame__楼主2020/9/13 07:33

觉得vector挺方便用vector写了一次,但是死活都是TLE,不知道是写法问题还是vector的问题(,请dalao帮忙看看QAQ,要是没问题的话就写数组的算了待会(

#include<bits/stdc++.h>
    
#define LL long long
    
#define _ 0
    
using namespace std;
    
/*Grievous Lady*/
    
const int BUF_SIZE = 1 << 13;
    
char buf[BUF_SIZE] , *buf_s = buf , *buf_t = buf + 1;
    
#define PTR_NEXT() \
{ \
    buf_s ++; \
    if(buf_s == buf_t) \
    { \
        buf_s = buf; \
        buf_t = buf + fread(buf , 1 , BUF_SIZE , stdin); \
    } \
}
    
template <typename _m_> void mian(_m_ & _n_){
    int _x_ = 0 , _nega_ = 0;
    while(*buf_s != '-' && !isdigit(*buf_s)) PTR_NEXT(); if(*buf_s == '-'){_nega_ = 1; PTR_NEXT();}
    while(isdigit(*buf_s)){_x_ = _x_ * 10 + *buf_s - '0'; PTR_NEXT();} if(_nega_) _x_ = -_x_; (_n_) = (_x_);
}
    
// #define int long long

#define mod 998244353

int n , k;

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;
}

inline void NTT(vector<int> &y , int len , int opt){
    y.resize(len);
    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 = g * 1LL * g1 % mod){
                int res = y[i + k + j] * 1LL * 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.begin() + 1 , y.end());
        for(int i = 0 , inv = quick_pow(len , mod - 2);i < len;i ++) y[i] = 1LL * y[i] * inv % mod;
    }
    delete []rev;
}

inline vector<int> operator +(vector<int> a , vector<int> b){
    vector<int> res;
    res.resize(max(a.size() , b.size()));
    a.resize(res.size()); b.resize(res.size());
    for(int i = 0;i < (int)res.size();i ++){
        res[i] = (a[i] + b[i]) % mod;
    }
    return res;
}

inline vector<int> operator -(vector<int> a , vector<int> b){
    vector<int> res;
    res.resize(max(a.size() , b.size()));
    a.resize(res.size()); b.resize(res.size());
    for(int i = 0;i < (int)res.size();i ++){
        res[i] = ((a[i] - b[i]) % mod + mod) % mod;
    }
    return res;
}

inline vector<int> operator *(vector<int> a , vector<int> b){
    int tot = a.size() + b.size() - 1;
    int len = 1;for(; len <= tot;) len <<= 1; 
    NTT(a , len , 1); NTT(b , len , 1);
    vector<int> res; res.resize(len);
    for(int i = 0;i < len;i ++) res[i] = 1LL * a[i] * b[i] % mod;
    NTT(res , len , -1); res.resize(tot);
    return res;
}

vector<int> poly_inv(vector<int> a){
    if(a.size() == 1){ a[0] = quick_pow(a[0] , mod - 2); return a; }
    int len = a.size() , len1 = (len + 1) / 2;
    vector<int> b = a;
    b.resize(len1); b = poly_inv(b);
    int res = 1;for(; res <= n * 2 ;) res <<= 1;
    NTT(a , res , 1); NTT(b , res , 1);
    for(int i = 0;i < res;i ++) a[i] = ((1LL * b[i] * (2 - 1LL * a[i] * b[i] % mod)) % mod + mod) % mod;
    NTT(a , res , -1);
    a.resize(n); return a;
}

inline vector<int> poly_r(vector<int> a){
    reverse(a.begin() , a.end());
    return a;
}

inline void poly_div(vector<int> F , vector<int> G , vector<int> &Q , vector<int> &R){
    if(F.size() < G.size()) F.resize(G.size());
    int lenf = F.size() - 1 , leng = G.size() - 1;
    vector<int> G_r = poly_r(G);
    G_r.resize(lenf - leng + 1);
    Q = poly_r(F) * poly_inv(G_r);
    Q.resize(lenf - leng + 1); Q = poly_r(Q);
    vector<int> G_Q = G * Q;
    R.resize(leng); G_Q.resize(leng); F.resize(leng);
    for(int i = 0;i < leng;i ++) R[i] = ((F[i] - G_Q[i]) % mod + mod) % mod;
}

inline vector<int> poly_quick_pow(vector<int> a , int b , vector<int> MOD){
    vector<int> res , tmp;
    res.resize(1); res[0] = 1;
    for(; b ; b >>= 1 , a = a * a , poly_div(a , MOD , tmp , a)){
        if(b & 1){
            res = res * a;
            poly_div(res , MOD , tmp , res);
        }
    }
    return res;
}

inline int Ame_(){
    mian(n) , mian(k);
    vector<int> F , A;
	F.resize(k + 1); A.resize(k);
	for(int i = 1;i <= k;i ++){
		mian(F[i]); F[i] = ((F[i] % mod) + mod) % mod;
	}
	for(int i = 0;i < k;i ++){
		mian(A[i]); A[i] = ((A[i] % mod) + mod) % mod;
	}
	vector<int> yuni; yuni.resize(k + 1);
	for(int i = 0;i < k;i ++) yuni[i] = (mod - F[k - i]) % mod;
	yuni[k] = 1;
	vector<int> init;
	init.resize(2); init[1] = 1;
	init = poly_quick_pow(init , n , yuni);
	LL ans = 0;
	for(int i = 0;i < k;i ++) ans = (ans + init[i] * 1LL * A[i] % mod) % mod;
	printf("%lld\n", ans);
    return ~~(0^_^0);
}
    
int Ame__ = Ame_();
    
signed main(){;}

/*
6 4
3 -1 0 4
-2 3 1 5
*/
2020/9/13 07:33
加载中...