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;
}
posted @ 2022-05-04 19:55  象征阳光  阅读(14)  评论(0)    收藏  举报  来源