您的位置:首页 > 运维架构

hust 1626 Cutting rope 概率论

2016-02-08 15:36 417 查看

题目

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105318#problem/B

题目来源:2016寒假第二次高年级训练

简要题意:求长为nn的绳子,切成m−1m-1段后最短的一段的期望长度。

题解

开始看的时候无从下手,看了其他人的代码也无法理解,知道后来看了某题解。

令AiA_i为最短的一段为ii的概率,BiB_i为最短一段长度至少为ii的概率。则有:

1⩽i⩽n/m1\leqslant i \leqslant n/m

Ai=Bi−Bi+1A_i=B_i-B_{i+1}

An/m+1=Bn/m+1=0A_{n/m+1}=B_{n/m+1}=0

E=∑i=1n/mAi⋅i=∑i=1n/mBiE=\sum\limits_{i=1}^{n/m}{A_i\cdot i}=\sum\limits_{i=1}^{n/m}{B_i}

于是只要求出BiB_i累加就行了。

使用隔板法可知,Bi=Cm−1n−(i−1)m−1/Cm−1n−1=∏j=1m−1n−j−(i−1)mn−jB_i=C_{n-(i-1)m-1}^{m-1}/C_{n-1}^{m-1}=\prod\limits_{j=1}^{m-1}{\frac{n-j-(i-1)m}{n-j}}

于是两层循环求出结果即可。

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>

#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define fi first
#define se second
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
LL powmod(LL a,LL b, LL MOD) {LL res=1;a%=MOD;for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;}
// head

int main()
{
int t, n, m;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
double ans = 0.0;
for (int i = 1; i <= n/m; i++) {
double p = 1.0;
for (int j = 1; j < m; j++) {
p *= double(n-j - m*(i-1)) / (n-j);
}
ans += p;
}
printf("%.5f\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: