Try   HackMD

平均變異次數

題目

  • n,k,c[1]c[k]
    • 代表
      a
      出現
      c[1]
      次,
      b
      出現
      c[2]
    • i=1kc[i]=n
    • 這些
      1k
      組成了一個長度為
      n
      的字串
  • 問對於這些字元能組成的排列字串
    a
    i=1n1[aiai+1]
    的總和除以方法數是多少
    • 對於每種排列
      a
      i=1n1[aiai+1]
      加起來之後再去除以「排列方法數」是多少

想法

  • ans=1ai=1n1[aiai+1]

  • ans=i=1n11a[aiai+1]

  • Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

    • 我們先只討論

      i=1

    • 紅色的地方就是在算平均有幾次

      [a1a2]

    • 平均次數

      = 期望次數

平均值跟期望值的關西

?

骰正常的

6 面骰子,骰
6
次,請問能骰到的平均點數

avg==1+2+3+4+5+66

E[X]=1×x1+2×x2+...+n×xn=16×1+16×2+16×3+16×4+16×5+16×6=1+2+3+4+5+66

骰子的

6 面分別為
{1,1,2,2,3,3}
,骰
6
次,請問能骰到的平均點數

avg==1+1+2+2+3+36

E[X]=1×x1+2×x2+...+n×xn=26×1+26×2+26×3=1+1+2+2+3+36

  • 期望值就是把機率乘上

    value , 平均值就是總方法數分之每次
    value

  • 機率其實就是

  • 代表期望值可以寫成

E[x]=×value=value+value+..value

  • 就跟平均的一模一樣

所以平均值

=期望值

  • 回到剛剛的問題

  • 平均次數

    = 期望次數
    =1×P+0×(1P)=P

    • 代表在這個題目機率
      P=
      期望次數
    • 所以我們下面直接用機率來算
    • 其中
      P
      [a1a2]
      的機率
    • P=1P([a1=a2])
  • 因為期望值可以線性疊加

    • E[x1+x2]=E[x1]+E[x2]
    • 全部一起算
      =
      單獨分開算
  • 令總字數為

    m

    • m=i=1kc[i]
  • P([a1=a2])=c[a]m×c[a]1(m1)+c[b]m×c[b]1(m1)+..

  • ex:aabbbcc

    • P([a1=a2])=27×16+37×26+27×16
    • a
      放在第一個的機率為
      27
      (因為總共
      7
      個字母他站兩個)
    • a
      放在第一個又放在第二個的機率為
      27×16
      (因為總共
      7
      個字母
      a
      站兩個,
      a
      已經放一個下去了所以剩
      1
      個全部剩
      6
      個)
  • 又類似抽籤跟順序無關

    • 我們放的位置
      ai,ai+1
      也跟順序無關
    • 所以任意
      ai,ai+1
      都是一樣的,直接
      P([a1a2])×(n1)
      就是答案了 (
      n1
      個縫)

CODE

#include <bits/stdc++.h> #define int long long using namespace std; const int maxn = 3e5 + 5; int n, m, k; int c[maxn]; void init () { cin >> n >> k; for (int i = 1; i <= k; i++) { cin >> c[i]; m += c[i]; } } void solve () { double ans = 0; for (int i = 1; i <= k; i++) { ans += (double) (c[i] * (c[i] - 1)) / ((m) * (m - 1)); } ans = (double) (1 - ans) * (n - 1); cout << fixed << setprecision (3) << ans << "\n"; } signed main() { // ios::sync_with_stdio(0); // cin.tie(0); int t = 1; //cin >> t; while (t--) { init(); solve(); } }
tags: 題解