题目:链接
题意:抛n次骰子,求k出现的概率为多少(乘以100后向下取整)
思路:当n较小时,是一个很简单的dp问题,用一个二维数组(横轴为抛骰子的次数,纵轴为n次 骰子的数值的和)储存即可。
可是本题的n----->100000,已经太大太大了,
进一步观察题目, rounded down to the nearest integer。向下取整,结合多项式分布特点。
知:当n较大时,概率绝对会小于1%,故此时可直接输出0。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<math.h>
#include<vector>
#include<string>
#include<map>
#include<queue>
#include<algorithm>
#include<string.h>
using namespace std;
/*
rounded down........也就是说小于1%的情况不用考虑。。。。。
大概好像是二项式分布。。。忘了,当n较大时每项概率都在减小,
所以当n较大时,可直接输出0
*/
float my_map[800][800 * 6];
int main()
{
int n;
cin >> n;
memset(my_map, 0, sizeof(my_map));
my_map[0][0] = 1;
//填充数组
for (int i = 0; i < 788; i++)
{
for (int j = i; j <= i*6; j++)
{
for (int k = 1; k <=6; k++)
{
my_map[i + 1][j + k] += my_map[i][j] / 6.0;
}
}
}
while (n--)
{
int times, sum;
cin >> times >> sum;
if (times>750)
{
cout << 0 << endl;
}
else
{
cout << (int)(my_map[times][sum]*100) << endl;
}
}
return 0;
}