社区讨论
[悬关]萌新求助卡常
P9164 「INOH」Round 1 - 狂气参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjupqs7
- 此快照首次捕获于
- 2025/11/04 08:49 4 个月前
- 此快照最后确认于
- 2025/11/04 08:49 4 个月前
rt,萌新的代码太垃圾了,跑不动,求求各位大佬帮我卡常。
CPP#include<bits/stdc++.h>
#define Poly vector<int>
#define mid ((l+r)>>1)
#define ls (x<<1)
#define rs ((x<<1)|1)
using namespace std;
namespace IO{
char buff[1<<21],*p1=buff,*p2=buff;
char getch(){
return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;
}
template<typename T>
void read(T &x){
char ch=getch();int fl=1;x=0;
while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();}
while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();}
x*=fl;
}
template<typename T,typename ...Args>
void read(T &x,Args& ...args){
read(x);read(args...);
}
char obuf[1<<21],*p3=obuf;
void putch(char ch){
if(p3-obuf<(1<<21))*p3++=ch;
else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;
}
void pc(const char *s){
while(*s)putch(*s),s++;
}
char ch[100];
template<typename T>
void write(T x){
if(!x)return putch('0');
if(x<0)putch('-'),x*=-1;
int top=0;
while(x)ch[++top]=x%10+48,x/=10;
while(top)putch(ch[top]),top--;
}
template<typename T,typename ...Args>
void write(T x,Args ...args){
write(x),putch(' '),write(args...);
}
void flush(){fwrite(obuf,p3-obuf,1,stdout);}
}
using namespace IO;
const int mod=998244353,g=3,ig=332748118,N=2e5+5;
inline int Mod(int x){return x>=mod?x-mod:x;}
inline int poww(int x,int y){
int sum=1;
while(y){
if(y&1)sum=1ll*sum*x%mod;
x=1ll*x*x%mod;
y>>=1;
}
return sum;
}
int rev[N<<1];
void Init(int len){for(int i=0;i<(1<<len);i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));}
void NTT(Poly &a,int len,int ops){
for(int i=0;i<len;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int m=2;m<=len;m<<=1){
int wn=poww(ops?g:ig,(mod-1)/m);
for(int i=0;i<len;i+=m){
int w=1;
for(int j=0;j<m/2;j++){
int u=a[i+j],t=1ll*w*a[i+j+m/2]%mod;
a[i+j]=Mod(u+t);
a[i+j+m/2]=Mod(u+mod-t);
w=1ll*w*wn%mod;
}
}
}
if(!ops){
int inv=poww(len,mod-2);
for(int i=0;i<len;i++)
a[i]=1ll*inv*a[i]%mod;
}
return;
}
Poly operator *(Poly a,Poly b){
int len=0,tmp=(int)a.size()+(int)b.size();
while((1<<len)<tmp)len++;
a.resize(1<<len),b.resize(1<<len);
Init(len);
NTT(a,1<<len,1),NTT(b,1<<len,1);
for(int i=0;i<(1<<len);i++)a[i]=1ll*a[i]*b[i]%mod;
NTT(a,1<<len,0);
return a;
}
Poly operator +(Poly a,Poly b){
int len=max(a.size(),b.size());
a.resize(len),b.resize(len);
for(int i=0;i<len;i++)a[i]=Mod(a[i]+b[i]);
return a;
}
int n;
int c[N];
struct node{
Poly A,B,C,D;
};
node sol(int l,int r){
if(l==r){
node x;
if(c[l]==1){
x.A.resize(1);
x.B.resize(2);
x.D.resize(1);
x.A[0]=1;
x.B[1]=1;
x.D[0]=1;
}else{
x.A.resize(1);
x.C.resize(1);
x.D.resize(1);
x.A[0]=1;
x.C[0]=1;
x.D[0]=1;
}
return x;
}
node L=sol(l,mid),R=sol(mid+1,r),x;
int len=(r-l)/2+2;
x.A=L.A*R.A+L.C*R.B;
x.B=L.B*R.A+L.D*R.B;
x.C=L.A*R.C+L.C*R.D;
x.D=L.B*R.C+L.D*R.D;
return x;
}
signed main(){
read(n);
for(int i=1;i<=n;i++){
char ch=getch();
if(ch=='1')c[i]=2;
else c[i]=1;
}
node tmp=sol(1,n);
int ans=1;
int pos=0;
for(auto x:tmp.A){
if(pos>=n)break;
ans=1ll*(x+1)*ans%mod;
pos+=2;
}
pos=1;
for(auto x:tmp.C){
if(pos>=n)break;
ans=1ll*(x+1)*ans%mod;
pos+=2;
}
write(ans);
flush();
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...