觉得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
*/