#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define Fast_IO ios::sync_with_stdio(false);
#define fir first
#define sec second
#define mod 998244353
#define G 3
inline int read()
{
char ch=getchar(); int nega=1; while(!isdigit(ch)) {if(ch=='-') nega=-1; ch=getchar();}
int ans=0; while(isdigit(ch)) {ans=ans*10+ch-48;ch=getchar();}
if(nega==-1) return -ans;
return ans;
}
typedef pair<int,int> pii;
int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int sub(int x,int y){return x-y<0?x-y+mod:x-y;}
int mul(int x,int y){return 1uLL*x*y%mod;}
int qpow(int x,int y)
{
int ans=1;
while(y)
{
if(y&1) ans=mul(ans,x);
x=mul(x,x);
y>>=1;
}
return ans;
}
int Inv(int x)
{
return qpow(x,mod-2);
}
namespace Poly
{
vector<int> rev,rt,one(1,1);
vector<int> operator + (vector<int> a,vector<int> b)
{
int n=max(a.size(),b.size());
a.resize(n),b.resize(n);
for(int i=0;i<n;i++) a[i]=add(a[i],b[i]);
return a;
}
vector<int> operator - (vector<int> a,vector<int> b)
{
int n=max(a.size(),b.size());
a.resize(n),b.resize(n);
for(int i=0;i<n;i++) a[i]=sub(a[i],b[i]);
return a;
}
void init(int B)
{
int n=1<<B;
rev.resize(n),rt.resize(n);
for(int i=1;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(B-1));
for(int mid=1;mid<n;mid<<=1)
{
int w=qpow(G,(mod-1)/(mid<<1));
rt[mid]=1;
for(int i=1;i<=mid;i++) rt[mid+i]=mul(rt[mid+i-1],w);
}
}
void NTT(vector<int> &a,int B)
{
int n=1<<B;
for(int i=0;i<n;i++) if(rev[i]>i) swap(a[i],a[rev[i]]);
for(int mid=1;mid<n;mid<<=1)
{
for(int i=0;i<n;i+=(mid<<1))
{
for(int j=0;j<mid;j++)
{
int x=a[i+j],y=mul(a[i+j+mid],rt[j+mid]);
a[i+j]=add(x,y),a[i+j+mid]=sub(x,y);
}
}
}
}
vector<int> operator * (vector<int> a,vector<int> b)
{
int B=0,n=a.size()+b.size()-1;
while((1<<B)<n) B++;
a.resize(1<<B),b.resize(1<<B);
init(B);
NTT(a,B),NTT(b,B);
for(int i=0;i<(1<<B);i++) a[i]=mul(a[i],b[i]);
reverse(a.begin()+1,a.end());
NTT(a,B);
a.resize(n);
int In=Inv(1<<B);
for(int i=0;i<n;i++) a[i]=mul(a[i],In);
return a;
}
};
using Poly::operator *;
void poly_multiply(unsigned *a, int n, unsigned *b, int m, unsigned *c)
{
vector<int> x(n+1),y(m+1);
for(int i=0;i<=n;i++) x[i]=a[i];
for(int i=0;i<=m;i++) y[i]=b[i];
x=x*y;
for(int i=0;i<=n+m;i++) c[i]=x[i];
}
Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
Testcase #1 | 213.631 ms | 54 MB + 948 KB | Accepted | Score: 100 | 显示更多 |