【BZOJ1416/1498】【NOI2006】神奇的口袋(数论,概率)

题面

BZOJ1416

BZOJ1498

洛谷

题面都是图片形式是什么鬼。。

题解

考虑以下性质

1.\(x[1],x[2]..x[n]\)等价于\(1,2,...n\)

证明:

假设取第\(k\)步以前,所有的球的个数分别是\(a[1],a[2]..a[n]\),

球的总数是\(sum\)

那么,第\(k\)步取到颜色\(y\)的概率是\(\frac{a[y]}{sum}\)

考虑第\(k+1\)步取到颜色\(y\)的概率

①第\(k\)步取了颜色\(y\)

那么,\(k+1\)步取到\(y\)的概率是\(\frac{a[y]}{sum}*\frac{a[y]+D}{sum+D}\)

②第\(k\)步没有取到颜色\(y\)

那么,\(k+1\)步取到\(y\)的概率是\(\frac{sum-a[y]}{sum}*\frac{a[y]}{sum+D}\)

将概率相加,得到第\(k+1\)步的概率

\[\frac{a[y](a[y]+D)+(sum-a[y])a[y]}{sum(sum+D)}
\]

\[=\frac{a[y](sum+D)}{sum(sum+D)}=\frac{a[y]}{sum}
\]

因此,在没有其他限制下,无论何时取\(y\)的概率都是相等的

也就是题目中按照\(x\)排序之后,可以直接将\(x\)离散。

但是题目中显然存在其他限制,也就是前面的某一次必定会取到某个颜色,所以我们来考虑另外一个性质。

颜色出现的顺序对答案没有影响

对于按照\(x\)排序之后,相邻的两个\(y[i],y[i+1]\)

①\(y[i]=y[i+1]\),显然没有影响

②\(y[i]\neq y[i+1]\)

考虑概率

\[P1=\frac{a[y[i]]}{sum}*\frac{a[y[i+1]]}{sum+D}
\]

交换之后考虑概率

\[P2=\frac{a[y[i+1]]}{sum}*\frac{a[y[i]]}{sum+D}
\]

\(P1\)显然等于\(P2\)

因此,\(y\)的出现顺序与结果无关。

根据上面的两个性质,我们可以得出:

1.\(x\)可以直接离散

2.\(y\)的顺序对结果并没有影响

因此,我们可以就按照读入顺序处理,并且\(x\)读进来并没有什么用

记录一下每一个颜色的球个数,以及球的总数

每次要抽到一个颜色的球就给他的数量以及总数都加上\(D\)

然后算一下概率就行了

因此范围比较大,概率要用高精度算

为了防止要写高精度除法

可以先分解质因数,然后约掉之后再做乘法就行了。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 1111
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct BigInt
{
int s[20000],ws;
void init(){s[1]=1;ws=1;}
void Multi(int x)
{
for(int i=1;i<=ws;++i)s[i]=s[i]*x;
for(int i=1;i<=ws;++i)s[i+1]+=s[i]/10,s[i]%=10;
while(s[ws+1])++ws,s[ws+1]=s[ws]/10,s[ws]%=10;
}
void output(){for(int i=ws;i;--i)printf("%d",s[i]);}
}Ans1,Ans2;
int pri[20001],tot;
bool zs[20001];
void getpri()
{
zs[1]=true;
for(int i=2;i<=20000;++i)
{
if(!zs[i])pri[++tot]=i;
for(int j=1;j<=tot&&i*pri[j]<=20000;++j)
{
zs[i*pri[j]]=true;
if(i%pri[j]==0)break;
}
}
}
int Mul[20001],Div[20001];
int sum,a[MAX];
int n,m,D;
void Calc(int x,int *f)
{
for(int i=1;i<=tot;++i)
while(x%pri[i]==0)
{
f[pri[i]]++;
x/=pri[i];
}
}
int main()
{
n=read();m=read();D=read();
for(int i=1;i<=n;++i)a[i]=read(),sum+=a[i];
getpri();
for(int i=1;i<=m;++i)
{
int x=read(),y=read();
if(!a[y]){puts("0/1");return 0;}
Calc(a[y],Mul);Calc(sum,Div);
a[y]+=D;sum+=D;
}
for(int i=1;i<=20000;++i)
if(Div[i]>=Mul[i])Div[i]-=Mul[i],Mul[i]=0;
else Mul[i]-=Div[i],Div[i]=0;
Ans1.init();Ans2.init();
for(int i=1;i<=20000;++i)
for(int j=1;j<=Mul[i];++j)Ans1.Multi(i);
for(int i=1;i<=20000;++i)
for(int j=1;j<=Div[i];++j)Ans2.Multi(i);
Ans1.output();putchar('/');Ans2.output();puts("");
return 0;
}

【BZOJ1416/1498】【NOI2006】神奇的口袋(数论,概率)的更多相关文章

  1. BZOJ 1416: [NOI2006]神奇的口袋( 高精度 )

    把x1~xn当成是1~n, 答案是不会变的. 然后直接模拟就行了...... P.S 双倍经验... BZOJ1416 && BZOJ1498 -------------------- ...

  2. ●BZOJ 1416 [NOI2006]神奇的口袋

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1416题解: Pòlya瓦罐模型: 给定罐子里每种颜色的球的个数A[i],按题目要求随机操作若 ...

  3. Bzoj1498&1416: [NOI2006]神奇的口袋

    什么鬼双倍经验题??? Sol 考虑在第\(k\)次摸到\(y\)的概率 如果上次摸到\(y\),目前有\(sum\)个球,\(y\)有\(a[y]\)个,那么概率就是\(\frac{a[y]+d}{ ...

  4. 神奇的口袋(dp)

    有一个神奇的口袋,总的容积是40,用这个口袋可以变出一 些物品,这些物品的总体积必须是40. John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2……an.John可 ...

  5. [codeup] 2044 神奇的口袋

    题目描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中选 ...

  6. dp 神奇的口袋

    有一个神奇的口袋,总的容积是40,用这个口袋可以变出一 些物品,这些物品的总体积必须是40.  John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2--an.Joh ...

  7. 九度OJ 1114:神奇的口袋 (DFS、DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:948 解决:554 题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个 ...

  8. 九度oj 题目1114:神奇的口袋

    题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中 ...

  9. 百练2755:神奇的口袋(简单dp)

    描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中选择一些 ...

随机推荐

  1. python2 - 列表

    列表 a = [1,2,3,4,5,6,7] a[0:4:1]//正向索引 a[-1:-2:-1]//反向索引 列表添加 a = [1, 2] b = [3, 4] +:a + b//把a和b连接,重 ...

  2. centos 7 安装和基本配置

    U盘安装centos 7 还是官方文档最准确. 下载centos https://docs.centos.org/en-US/centos/install-guide/downloading/ 制作安 ...

  3. 第三篇 Python关于mysql的API--pymysql模块, mysql事务

    python关于mysql的API--pymysql模块 pymysql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同. 模块安装 pip install pymys ...

  4. Rest-Assured 测试框架

    Rest-Assured 是一个测试 Restful Web Service 的 Java 类库,我们能够测试各种各样的请求组合,依次测试核心业务逻辑的不同组合. 它是通过发送特定的rest api, ...

  5. Centos7 Zabbix监控部署

    Zabbix监控 官方文档 https://www.zabbix.com/documentation/3.4/zh/manual https://www.zabbix.com/documentatio ...

  6. Log4Net的使用研究(一)

    等待研究中………… 20160421 标题:C#使用Log4Net记录日志   文章地址: http://www.cnblogs.com/wangsaiming/archive/2013/01/11/ ...

  7. C语言文法翻译

    <程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...

  8. JavaScript设计模式学习之路——面向对象的思想

    今天,我拿到了张容铭写的这本<JavaScript设计模式>这本书,开始了关于JavaScript更深一点的学习. 看到这本书开始的时候,虽然之前通过看书.一些比较好的视频的讲解,对Jav ...

  9. (六)Jmeter重要组件的执行顺序及作用域

    一.Jmeter重要组件: 1)配置元件---Config Element: 用于初始化默认值和变量,以便后续采样器使用.配置元件大其作用域的初始阶段处理,配置元件仅对其所在的测试树分支有效,如,在同 ...

  10. VC的常用调试方法

    前言 VS是非常强大的IDE,所以掌握VSVC的常用方法,将会使得我们找出问题解决问题事半功倍. 目录 VSVC的常用调试方法 前言 1. Watch窗口查看伪变量 2. 查看指针指向的一序列值 3. ...