题解:P10877 「KDOI-07」n1gr tS0i

题解

当时看到这道题没什么思路,但是看过数据大小后,能肯定的是,这是一道数学题

所以,我直接打了一个暴力


暴力

void dfs(ll x){
	if(x>n){
		ll p=0;
		for(int i=1;i<=k;i++){
			if(ss==c[i]){
				p=1;
				break;
			}
		}
		if(p==0)c[++k]=ss,ans++;
		return;
	}
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			for(int l=i;l<=j;l++){
				if(ss[l]=='1')ss[l]='0';
				else ss[l]='1';
			}
			dfs(x+1);
			for(int l=i;l<=j;l++){
				if(ss[l]=='1')ss[l]='0';
				else ss[l]='1';
			}
		}
	}
}

轻松得到了 30 分

非常简洁啊

很快,就得到了规律

\(n=2,ans=1\)

\(n=3,ans=4\)

\(n=4,ans=16\)

\(n=5,ans=32\)

\(n=6,ans=64\)

无论输入任何 01 串,当 n 确定时,答案就是固定的

由此我们可以得到推论


推论

\(当n=2时,ans=1\)

\(当n=3时,ans=4\)

\(当n \ge 4时,ans= 2^n\)

所以正解就很明晰了


代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll t,n,mod=998244353;
string s;
int main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%d",&n);
		getchar();
		getline(cin,s);
		if(n==2)printf("1\n");
		else if(n==3)printf("4\n");
		else{
			ll ans=1;
			for(int i=1;i<=n;i++)ans*=2,ans%=mod;
			printf("%lld\n",ans%mod);
		}
	}
}

然后就非常愉快的 AC 了

如果有讲错的或者讲的不好的,请大家提出!

严谨推论可以去看官方题解

谢谢

posted @ 2025-09-10 21:42  一班的hoko  阅读(4)  评论(0)    收藏  举报