DNA Alignment

C. DNA Alignment

来推导一下这个题:
假设在给定的 s 串中,A,T,C,G分别有 a,b,c,d 个,而要匹配的串中有 A,B,C,D 个,所以其 ρ 值为\(Aa+Bb+Cc+Dd\),而 \(A+B+C+D=a+b+c+d=n\),我们可以自己掌控 A B C D 的多少,

试想一下要拿一个 1 分配给 A B C D 其中一个,要使得 ρ 值最大,那只有一种选择的办法,就是把分配给 对应的小写字母\((a,b,c,d)\)中最大的那个,所以就把 n 都给这个数就可以了。

\((a,b,c,d)\)中可能出现多个(假设有 m 个)最大值,那么对于每一个位置,选择最大值中的任意一种都是可以的,那么答案就是\(m^n\)

代码:

// Created by CAD on 2020/1/12.
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int mod=1e9+7;
ll qpow(ll x,ll n)
{
    ll ans=1;
    while(n)
    {
        if(n&1) ans=(ans*x+mod)%mod;
        x=(x*x)%mod,n=n>>1;
    }
    return ans;
}
int cnt[5];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;  cin>>n;
    string s;   cin>>s;
    for(auto i:s)
    {
        if(i=='A') cnt[1]++;
        if(i=='T') cnt[2]++;
        if(i=='C') cnt[3]++;
        if(i=='G') cnt[4]++;
    }
    int cou=0,maxn=0;
    for(int i=1;i<=4;++i)
    {
        if(cnt[i]>maxn) maxn=cnt[i],cou=1;
        else if(cnt[i]==maxn) cou++;
    }
    cout<<qpow(cou,n)<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/CADCADCAD/p/12183458.html
DNA