社区讨论

[悬关]萌新求助卡常

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 条回复,欢迎继续交流。

正在加载回复...