没有标题
非常亲民的板子,只有7K不到(包括火车头,vector不加O2就凉了)
以后可以来调调常数
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define poly vector<int>
using namespace std;
inline int in(int p=-1)
{
int ans=0,f=1;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s))
{
if(p==-1)ans=ans*10+s-'0';
else ans=(1ll*ans*10%p+s-'0')%p;
s=getchar();
}return ans*f;
}
const int N=5e6+10,mod=998244353,G=3;
int Add(int a,int b){return (a+b)%mod;}
int Dec(int a,int b){return a>=b?a-b:a-b+mod;}
int Mul(int a,int b){return 1ll*a*b%mod;}
int quick_mul(int a,int k){int ans=1;while(k){if(k&1)ans=Mul(ans,a);a=Mul(a,a);k>>=1;}return ans;}
int inv(int a){return quick_mul(a,mod-2);}
int inv2=inv(2);
int lim,rev[N];
int w;
struct nd{
int x,y;
nd(int a=0,int b=0){x=a;y=b;}
nd operator*(const nd &a)const{return nd(Add(Mul(x,a.x),Mul(Mul(y,a.y),w)),Add(Mul(x,a.y),Mul(y,a.x)));}
};
nd quick_mul(nd a,int k,nd ans=nd(1,0)){for(;k;k>>=1,a=a*a)if(k&1)ans=ans*a;return ans;}
bool check_sqrt(int a){return quick_mul(a,(mod-1)/2)==1;}
int get_w(int n)
{
for(int a=rand();;a=rand())
if(!check_sqrt(Dec(Mul(a,a),n)))
return w=Dec(Mul(a,a),n),a;
}
int get_sqrt(int n)
{
int a=get_w(n);
int x1=(quick_mul(nd(a,1),(mod+1)/2)).x;
int x2=mod-x1;
return x1<x2?x1:x2;
}
void init(int n)
{
for(lim=1;lim<n;lim<<=1);
for(int i=0;i<lim;i++)rev[i]=rev[i>>1]>>1|((i&1)?lim>>1:0);
}
void NTT(poly &A,int flag)
{
for(int i=0;i<lim;i++)if(i<rev[i])swap(A[i],A[rev[i]]);
for(int mid=1;mid<lim;mid<<=1)
{
int w=quick_mul(G,(mod-1)/(mid<<1));
for(int i=0;i<lim;i+=mid<<1)
{
int fw=1;
for(int j=0;j<mid;j++,fw=Mul(fw,w))
{
ll x=A[i+j],y=Mul(fw,A[i+j+mid]);
A[i+j]=Add(x,y),A[i+j+mid]=Dec(x,y);
}
}
}
if(flag==1)return ;
int inv_=inv(lim);reverse(A.begin()+1,A.end());
for(int i=0;i<lim;i++)A[i]=Mul(inv_,A[i]);
}
poly operator+(poly a,int b){a[0]=Add(a[0],b);return a;}
poly operator-(poly a,int b){a[0]=Dec(a[0],b);return a;}
poly operator*(poly a,int b){for(int i=0;i<a.size();i++)a[i]=Mul(a[i],b);return a;}
poly operator+(poly a,poly b){poly c=a;c.resize(max(a.size(),b.size()));for(int i=0;i<b.size();i++)c[i]=Add(c[i],b[i]);return c;}
poly operator-(poly a,poly b){poly c=a;c.resize(max(a.size(),b.size()));for(int i=0;i<b.size();i++)c[i]=Dec(c[i],b[i]);return c;}
poly operator*(poly a,poly b)
{
int deg=a.size()+b.size()-1;
if(a.size()<=32||b.size()<=32)
{
poly c(deg,0);
for(int i=0;i<(int)a.size();i++)
for(int j=0;j<(int)b.size();j++)
c[i+j]=Add(c[i+j],Mul(a[i],b[j]));return c;
}
init(deg);a.resize(lim);b.resize(lim);
NTT(a,1);NTT(b,1);
for(int i=0;i<lim;i++)a[i]=Mul(a[i],b[i]);
NTT(a,-1);a.resize(deg);return a;
}
poly Direv(poly a){for(int i=0;i+1<(int)a.size();i++)a[i]=Mul(a[i+1],i+1);a.pop_back();return a;}
poly Inter(poly a){for(int i=(int)a.size()-1;i;i--)a[i]=Mul(a[i-1],inv(i));a[0]=0;return a;}
poly Inv(poly a,int deg=-1)
{
if(deg==-1)deg=a.size();
poly b(1,inv(a[0])),c;
for(int len=2;(len>>1)<deg;len<<=1)
{
c.resize(len);init(len<<1);
for(int i=0;i<len;i++)c[i]=i<(int)a.size()?a[i]:0;
c.resize(lim);b.resize(lim);NTT(c,1);NTT(b,1);
for(int i=0;i<lim;i++)b[i]=Mul(b[i],Dec(2,Mul(b[i],c[i])));
NTT(b,-1);b.resize(len);
}b.resize(deg);return b;
}
poly Ln(poly a,int deg=-1)
{
if(deg==-1)deg=a.size();
a=Inter(Direv(a)*Inv(a,deg));
a.resize(deg);return a;
}
poly Exp(poly a,int deg=-1)
{
if(deg==-1)deg=a.size();
poly b(1,1),c;int n=a.size();
for(int len=2;(len>>1)<deg;len<<=1)
{
c=Ln(b,len);
for(int i=0;i<len;i++)c[i]=Dec(i<n?a[i]:0,c[i]);
c=c+1;b=b*c;b.resize(len);
}b.resize(deg);return b;
}
poly operator/(poly a,poly b)
{
int deg=a.size()-b.size()+1;
reverse(a.begin(),a.end());a.resize(deg);
reverse(b.begin(),b.end());a=a*Inv(b,deg);
a.resize(deg);reverse(a.begin(),a.end());return a;
}
poly operator%(poly a,poly b)
{
if(a.size()<b.size())return a;
a=a-(b*(a/b));a.resize(b.size()-1);return a;
}
poly Sqrt(poly a,int deg=-1)
{
if(deg==-1)deg=a.size();
poly b(1,get_sqrt(a[0])),c,d;
for(int len=4;(len>>2)<deg;len<<=1)
{
c=a;c.resize(len>>1);init(len);
d=Inv(b,len>>1);
c.resize(lim);d.resize(lim);
NTT(c,1);NTT(d,1);
for(int i=0;i<lim;i++)c[i]=Mul(c[i],d[i]);
NTT(c,-1);
b.resize(len>>1);
for(int i=0;i<(len>>1);i++)b[i]=Mul(Add(c[i],b[i]),inv2);
}b.resize(lim);
if(mod-b[0]<b[0])for(int i=0;i<b.size();i++)b[i]=Dec(0,b[i]);
return b;
}
poly quick_mul(poly a,int k,int deg=-1)
{
if(deg==-1)deg=a.size();
a=Exp(Ln(a)*k);
a.resize(deg);return a;
}
poly a,b,c,d;
int main()
{
}