您的位置:首页 > 其它

【整理】一堆磨人の数学概率期望

2015-03-05 13:55 281 查看
都是水题 = =

↑ 这四个字太能概括一切了

【1】 ZOJ 3785 What day is that day? (找规律)

题意:求11 + 22 +
33 + ... + NN 
mod 7 的值
打表可以找到循环节
实际上可以用费马小定理证明 sigma(i ^ i % 7) = sigma(i ^ (i % 6) % 7)
ans = (n / 42 % 7 * (s[42] % 7) % 7 + s[n % 42] % 7) % 7

【2】 ZOJ 3777 Problem Arrangement (状压dp + 数学期望)

题意:给定一个n*n的矩阵 在矩阵中每行选一个数 求第一次选出的数字和>=m的期望

设p为和小于m的概率 则 p = 不合法方案数 / 总方案数
设T为次数期望 则 T = (1 - p) * 1 + p * (1 - p) * 2 + p^2 * (1 - p) * 3 + ... + p^(n-1) * (1 - p)  * n    ①

① * p 得 p * T = p * (1 - p) * 1 + p^2 * (1 - p) * 2 + ... + p^(n-1) * (1 - p)  * (n - 1) + p^n * (1 - p) * n     ②
(① - ②) / (1 - p) 得 T = 1 + p + p ^ 2 + p ^ 3 + ... + p ^ (n - 1) + p^n * n
其中n → ∞ 则 T → 1 / (1 - p) 即 T → 1 / 合法方案数
其中合法方案数用状压dp可求出 dp[S][k] 表示二进制集合为S数字和为k的方案数 

【3】可重复组合

给出n个数字b1,b2,……,bn。求有多少个有序序列a1,a2,……,an,满足b1*b2*……*bn=a1*a2*……*an?(ai>1)

(1<bi<=1000000, b1*b2*…*bn<=10^25) n(1<=n<=20)

将数列b的每个数质因数分解并把系数相加 于是 a1 * a2 * ... * an = p1 ^ m1 + p2 ^ m2 + ... + pn ^ mn
既是将每个系数分配给a数列的每个数 对于每个pi的分法有 C( mi + n - 2, n - 1 ) 再相乘即可
至于分法的个数计算见很高端的一篇论文 ←
其实就是在n-1个位置放m-1个东西(可重复放置)的方案数

【4】 poj2096 Collecting Bugs

题意:软件s个子系统会产生n种bug 每种bug被发现几率和存在每个系统的概率相等 如果一天发现一种bug 求每个子系统都发现bug且所有bug都被发现的天数期望

当时看到这道题的时候就觉得眼熟 = =zsl给过的一道题 当时推公式推好久来着orz 其实特别基础的题。。而且这道题和那个在棋盘里放棋子 每行每列都要放一颗的那道题其实是差不多的orz

dp[i][j] 表示已经发现了i种bug属于j个子系统剩余天数的期望 (一定要注意是倒着求) 
dp[i][j] = dp[i][j] * (i * j) / (n * s) + dp[i + 1][j] * ((n - i)*j ) / (n * s) + dp[i][j + 1] * (i * (s - j)) / (n * s) + dp[i + 1][j + 1] * (n - i) * (s - j) / (n * s) + 1

移向然后就可以直接记忆化搜索啦

【5】zoj3329 One Person Game

题解:http://blog.csdn.net/qq_21841245/article/details/44094977

【6】sgu485 Kids and Prizes


题意:有n个盒子 每个盒子里有一个礼物 然后m个人每人去拿一次 拿完以后盒子还原 求期望拿走的礼物数

这题我开始时写了dp方程的。。后来发现它就是个数学题。。。
其实有个东西叫二项分布你造吧。。。

对于每个盒子:
每一次不被选择的概率为(n - 1) / n

m次都不被选择的概率为 [(n - 1) / n] ^ m

对于n个盒子:

m次不被选择的盒子的期望为   n * [ (n - 1) / n ] ^ m   (二项分布)

一个盒子要么被选要么不被选 所以被选的+不被选的期望为n
那么答案就是   n - (n * [ (n - 1) / n ] ^ m)  了 

【7】 ZOJ 3380 Patchouli's Spell Cards

题意:m个位置每个位置填入一个数 数的范围是1~n 求至少有L个位置的数一样的概率 输出最简分数的形式

这题是神题c++不可做。。。不知道有没有角虫写了c++高精度过了的。。。

贴个思路:

对于 l >m/2我们可以直接用组合数来求的 ans = n*Σ( C(m,i)*(n-1)^(m-i) )

如果 l <= m/2用DP f[i][j]表示前 i 个数放在 j 个位置并且相同的元素个数小于 l 的数目 

f[i][j]=sum{dp[i-1][j-k]*choose[m-(j-k)][k] | k≤j && k<l}

【8】HDU 4405 Aeroplane chess

题意:有n个格子 掷骰子往前走 其中有m个飞行通道可以直接从第xi格走到第yi格 求到终点的掷骰子次数期望

e[i] = e[link[i]] 或 sigma(e[j] / 6) + 1 其中link[i]为飞行通道能抵达i的 j为掷骰子可以到达i的 这个要反向递推 我开始写记忆化搜索爆栈了。。

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int N, M;
int link[100005];
double e[100005];

int main()
{
while(~scanf("%d%d", &N, &M) && N)
{
memset(link, 0, sizeof(link));
memset(e, 0, sizeof(e));
while(M--)
{
int x, y; scanf("%d%d", &x, &y);
link[x] = y;
}
for(int i = N-1; ~i; i--)
{
if(link[i]) e[i] = e[link[i]];
else
{
e[i] = 1.;
for(int j = 1; j <= 6 && i + j < N; ++j)
e[i] += e[i + j] / 6;
}
}
printf("%.4lf\n", e[0]);
}
return 0;
}


【9】HDU4336 Card Collector(状压+数学期望)

题意:有n种卡片 在一包零食里每种卡片有一个出现的概率 求要多少包零食才可以集齐所有卡片(召唤神龙)

题解:http://www.cnblogs.com/zhj5chengfeng/archive/2013/03/02/2939601.html

#include <cstdio>
#include <iostream>

using namespace std;

int N;
double p[21], f[1<<20];

int main()
{
while(~scanf("%d", &N))
{
for(int i = 1; i <= N; ++i) scanf("%lf", &p[i]);
f[(1 << N) - 1] = 0. ; double temp;
for(int S = (1 << N) - 2; ~S; S--)
{
f[S] = 1. , temp = 0. ;
for(int i = 1; i <= N; ++i)
{
if(S & (1 << (i - 1))) continue;
temp += p[i];
f[S] += p[i] * f[S | 1 << (i - 1)];
}
f[S] /= temp;
}
printf("%.4f\n", f[0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: