列表

详情


NC52278. 取球游戏

描述

小sun非常喜欢玩游戏,最近他和同学正在玩这样一个游戏:

sun有一个神奇的袋子,袋子里面有C种颜色的球,每种颜色的球都有无限多个。现在小sun每次将会从袋子里拿出一个球,然后将这个球放在桌面上,如果桌面上已经有这种颜色的球了,小孙就把它们两个重新放进袋子里。

在玩的时候小sun想到了一个问题,他想问问你:在第n次拿球后,桌上有m种颜色的球的概率是多少?

输入描述

输入一行:c,n,m代表的含义如题中所述。

输出描述

输出一行答案,保留3位小数

示例1

输入:

100 100000 50

输出:

0.159

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 18ms, 内存消耗: 10212K, 提交时间: 2019-09-18 11:02:42

#include<iostream>
using namespace std;
double dp[100010][123];
int main()
{
	long long c,n,m;
	cin>>c>>n>>m;
	if(n>10000) n=10000+(n&1);
	dp[0][0]=1.0;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=c;j++)
		{
			if(j) dp[i][j]=dp[i][j]+dp[i-1][j-1]*(c-j+1)/(c*1.0);
			dp[i][j]=dp[i][j]+dp[i-1][j+1]*(j+1)/(c*1.0);
		}
	}
	printf("%.3lf\n",dp[n][m]);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 1256K, 提交时间: 2019-09-13 22:14:18

#include<bits/stdc++.h>
using namespace std;
long long c,n,m;
double f[1005][101];
int main(){
	cin>>c>>n>>m;
	f[0][0]=1.0;
	if(n>=950)n=1000+(n&1);
	for(int i=1;i<=n;i++)
	for(int j=0;j<=i&&j<=c;j++){
		f[i][j]=1.0*f[i-1][j+1]*(j+1)/c;
		if(j)f[i][j]+=1.0*f[i-1][j-1]*(1.0-(double)(j-1)/c);
	}
	printf("%.3f",f[n][m]);
}

C++(g++ 7.5.0) 解法, 执行用时: 4ms, 内存消耗: 1208K, 提交时间: 2022-11-09 21:14:16

#include<iostream>
using namespace std;
long long c,n,m;
double f[1005][101];
int main(){
	cin>>c>>n>>m;
	f[0][0]=1.0;
	if(n>=950)n=1000+(n&1);
	for(int i=1;i<=n;i++)
	for(int j=0;j<=i&&j<=c;j++){
		f[i][j]=1.0*f[i-1][j+1]*(j+1)/c;
		if(j)f[i][j]+=1.0*f[i-1][j-1]*(1.0-(double)(j-1)/c);
	}
	printf("%.3f",f[n][m]);
}

上一题