一道自己看了代码才明白的简单构造

//codeforces 520c

//思路:两个字符串,第一个字符串不动,移动第二个的时候,你会发现第二个串的每个字符都会和第一个串的某个字符对一次,所以在构造的时候当然选择出现次数最多的那个

//如果假设次数出现最多的字符有k种,第一个字符有k种选择,第二个有k种选择....第n个字符有k种选择,

//rk(k,n); 

  #include<iostream>
  using namespace std;
  #define M 1000000007;
  int n;
  char a[100010];
  int c[5];

//二分快速求幂
  long long rk(int n, int k)
 {
     long long res = 1;
     while(k) {
         if(k & 1)
             res *= n, res %= M;
         n *= n;
        n %= M;
         k >>= 1;
     }
     return res;
 }
 int main()
 {
     int i;
     cin>>n>>a;

//遍历字符串,统计每个字符出现的次数
     for(i = 1; i <= n; ++i)
     {
         if(a[i]=='A')
            c[1]++;
         else if(a[i]=='G')
            c[2]++;
         else if(a[i]=='C')
            c[3]++;
         else
            c[4]++;
     }

//找出出现最多次的那个字符出现的次数
     int Max = max(max(c[1], c[2]), max(c[3], c[4]));
     int m=0;

//得到出现最多次字符的种类
     for(i = 1; i <= 4; ++i)
         if(Max == c[i])
             m++;
             cout<<rk(m, n)<<endl;
 }

原文地址:https://www.cnblogs.com/ACWQYYY/p/4313358.html