码迷,mamicode.com
首页 > 其他好文 > 详细

Gym100187B

时间:2018-08-11 19:35:46      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:1.0   char s   --   char   printf   main   define   clu   push   

Gym100187B


\(n\):表示字符的种类;
\(a_i\):表示单词i的个数;
\(Len\):表示串的长度;
先考虑一种单词\(a_i\)放在一个固定位置p对答案的贡献:
整一个串的全排类为:\[P = \frac{Len!}{a_1!a_2!...a_n!}\]
固定\(a_i\)的排列为:\[P_i = \frac{(Len-1)!}{a_1!a_2!...(a_i-1)!..a_n!}\]
对于最终答案贡献就是:\[ans_{i,p} = \frac{P_i^2}{P^2}\]
则有:\[ans_i = \sum_{p=1}^{Len} ans_{i,p} = \frac{Len P_i^2}{P^2} = \frac{a_i^2}{Len}\]
下面只需枚举字符求和即可:\[ans = \sum_{i=1}^{n}ans_i = \sum_{i=1}^{n} \frac{a_i^2}{Len}\]

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define pb push_back
#define PII pair<int,int>
typedef long long ll;
const int N = 1e5 + 7;
const int inf = 0x3f3f3f3f;
using namespace std;
int n,k,M[666],num;
char s[200007];
double ans = 0;
int main() {
    scanf(" %s",s+1);
    n=strlen(s+1);
    rep(i,1,n) ++M[s[i]-‘a‘];
    rep(i,0,25) {
        ans += (1.0*M[i]*M[i])/n;
    }
    printf("%.10f\n",ans);
    return 0;
}

Gym100187B

标签:1.0   char s   --   char   printf   main   define   clu   push   

原文地址:https://www.cnblogs.com/RRRR-wys/p/9460637.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!