CF1674C Infinite Replacement 题解
题意简述
给定仅由字符 'a' 组成且长度为 $ n $ 的非空字符串 $ s $ 和 非空字符串 $t$。可以将 $ s $ 中的一个 'a' 换作 $ t $。求能构成多少种不同的字符串;若可以构成无限多个,输出 '-1'。
Sol:
当 $t$ 中只有一个字符且该字符为 'a' 时,方案数为 $1$(换了,但没完全换)。
不难发现,构成无限多个方案时 $ t $ 中必定有 'a'(无限套娃)。
判断一下 $ t $ 中是否有 'a' 即可解决合法性 和 特殊情况。
对于 $ t $ 中没有 'a' 的情况,容易发现方案数为 $ 1 \sim n $ 在 $ n $ 中的组合数之和,即:
$$ \sum_{k=0}^{n}\binom{n}{k} $$
感觉和二项式定理的右边差不多:
$$ (x + a) ^ n = \sum_{k=0}^{n}\binom{n}{k} x^k a^{n-k} $$
可令上式中 $ x = a = 1$,就化出来了:
$$ 2 ^ n = \sum_{k=0}^{n}\binom{n}{k} 1^k 1^{n-k} = \sum_{k=0}^{n}\binom{n}{k} $$
也可以用一个集合的子集个数理解,具体请移步 P2415。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int main(){
ll T;
cin >> T;
while(T--){
string s,t;
cin >> s >> t;
if(t == "a"){
cout << 1 << endl;
continue;
}
bool f = false;
for(ll i = 0; i < t.size(); i++){
if(t[i] == 'a'){
f = true;
break;
}
}
if(f)
cout << -1 << endl;
else{
ll ans = pow(2,s.size());//这里得用一个临时变量存储,不然会炸。
cout << ans << endl;
}
}
return 0;
}

浙公网安备 33010602011771号