题解: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 了
如果有讲错的或者讲的不好的,请大家提出!
严谨推论可以去看官方题解
谢谢

浙公网安备 33010602011771号