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;
}