题面在这里

题意

开始时袋中有\(t\)种小球,第\(i\)种小球有\(t_i\)个,之后每次等概率取出一个球,第\(i\)次取球时观察这个球的颜色\(c_i\)放回并向袋中加入\(d\)个颜色为\(c_i\)的球;

给出一组询问\([x_i,y_i](1\le i\le n)\),求同时满足第\(x_i\)次取球的颜色为\(y_i\)的概率

\(1≤t,n≤1000, 1≤a_k ,d≤10, 1≤x_1<x_2<…<x_n≤10000, 1≤y_k≤t\)

hint

有没有注意到\(1≤x_1<x_2<…<x_n≤10000\)这个条件?

感觉又鬼畜又没有用对么?

那么我们把这个条件删掉

其实这个条件仅仅是在给你一个提示

sol

其实我做题的时候也不知道这个条件有什么用...于是我就没有做出来

如果\(x_i=i\)你还不会做?直接模拟即可

所以这道题直接模拟就可以了。

!!!!!!是的很震惊对吧

给你\(1≤x_1<x_2<…<x_n≤10000\)这个条件,

就是让你考虑怎么把这个条件化成\(x_i=i\)的......

接下来我们开始证明,

如果仅仅考虑一次抽取的情况,每次抽到颜色\(c\)的概率都是一样的,

即第\(i\)次抽到颜色\(c\)的概率和第\(i+1\)次抽到颜色\(c\)的概率相同

设第\(i\)次抽之前,袋子里总共有\(tot\)个球,有\(a\)个颜色为\(c\)的球(update 4.4:感谢 @GuessYCB的更正 orz)

那么第\(i\)次抽抽到\(c\)的概率显然是\(P_i=\frac{a}{tot}\)

那么第\(i+1\)次抽抽到\(c\)的概率呢?

\[P_{i+1}=\frac{a}{tot}\times\frac{a+d}{tot+d}+(1-\frac{a}{tot})\times\frac{a}{tot+d}=\frac{a}{tot}=P_i
\]

嗯是的

于是直接把\([x_1,x_2,x_3,...,x_n]\)转换为\([1,2,3,...,n]\)即可

注意高精(可以考虑先\(fact\),最后再化系数)

代码

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-10;
const int mod=1e9+7;
const int N=5010;
const int M=20010;
il ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
} il void file(){
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
} int t,n,d,a[N],y[N],sum;
int pri[M],vis[M];
il void sieve(){
vis[1]=1;
for(RG int i=2;i<M;i++){
if(!vis[i])pri[++pri[0]]=i;
for(RG int j=1;j<=pri[0]&&1ll*pri[j]*i<M;j++){
vis[i*pri[j]]=1;if(i%pri[j]==0)break;
}
}
} int sys[3][M];
il void fact(int x,int id){
for(RG int j=1;j<=pri[0]&&1ll*pri[j]*pri[j]<=x;j++)
while(x%pri[j]==0)sys[id][j]++,x/=pri[j];
for(RG int j=1;j<=pri[0]&&1ll*pri[j]<=x;j++){
while(x%pri[j]==0)sys[id][j]++,x/=pri[j];if(x==1)break;
}
} struct bignumber{
int ws,s[5005];
il void init(){ws=s[1]=1;}
il void times(int x){
if(!ws)init();
for(RG int i=1;i<=ws;i++)s[i]*=x;
for(RG int i=1;i<=ws;i++)
if(s[i]>=10)s[i+1]+=s[i]/10,s[i]%=10;
while(s[ws+1])ws++,s[ws+1]+=s[ws]/10,s[ws]%=10;
}
il void print(){
for(RG int i=ws;i;i--)printf("%d",s[i]);
}
}A[3]; il void solve(){
for(RG int i=1,minn;i<=pri[0];i++){
minn=min(sys[1][i],sys[2][i]);
sys[1][i]-=minn;sys[2][i]-=minn;
}
A[1].init();A[2].init();
for(RG int id=1;id<=2;id++)
for(RG int i=1;i<=pri[0];i++)
for(RG int j=1;j<=sys[id][i];j++)A[id].times(pri[i]);
A[2].print();printf("/");A[1].print();puts("");
} int main()
{
t=read();n=read();d=read();sieve();
for(RG int i=1;i<=t;i++)a[i]=read(),sum+=a[i];
for(RG int i=1;i<=n;i++)
read(),y[i]=read(),fact(a[y[i]],2),a[y[i]]+=d,fact(sum,1),sum+=d;
solve();return 0;
}

[NOI2006]神奇口袋的更多相关文章

  1. 洛谷P4204 [NOI2006]神奇口袋 数论

    正解:数论 解题报告: 传送门 第一次用\(\LaTeX\)和\(markdown\),,,如果出了什么锅麻烦在评论跟我港句QAQ \(1)x_{i}\)可以直接离散 \(2)y_{i}\)的顺序对结 ...

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

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

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

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

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

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

  5. Luogu P4204 神奇口袋 题解报告

    题目传送门 [题目大意] 一个口袋里装了t种颜色的球,第i种颜色的球的数目为a[i],每次随机抽一个小球,然后再放d个这种颜色的小球进口袋. 给出n个要求,第x个抽出的球颜色为y,求满足条件的概率. ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. 工作中那些提高你效率的神器(第二篇)_Listary

    引言 无论是工作还是科研,我们都希望工作既快又好,然而大多数时候却迷失在繁杂的重复劳动中,久久无法摆脱繁杂的事情. 你是不是曾有这样一种想法:如果我有哆啦A梦的口袋,只要拿出神奇道具就可解当下棘手的问 ...

  8. 工作中那些提高你效率的神器(第一篇)_Everything

    引言 无论是工作还是科研,我们都希望工作既快又好,然而大多数时候却迷失在繁杂的重复劳动中,久久无法摆脱繁杂的事情. 你是不是曾有这样一种想法:如果我有哆啦A梦的口袋,只要拿出神奇道具就可解当下棘手的问 ...

  9. 全网最详细的实用的搜索工具Listary和Everything对比的区别【堪称比Everything要好】(图文详解)

    不多说,直接上干货! 引言 无论是工作还是科研,我们都希望工作既快又好,然而大多数时候却迷失在繁杂的重复劳动中,久久无法摆脱繁杂的事情.   你是不是曾有这样一种想法:如果我有哆啦A梦的口袋,只要拿出 ...

随机推荐

  1. MySQL数据库基础

    MySQL数据库基础 本文的所有操作是基于CMD环境,MySQL通过在命令行中输入SQL语句对数据库进行操作.配置问题可参考<打通MySQL的操作权限>中的内容,该文算是针对前期的环境配置 ...

  2. golang urlencode

    u := url.Values{} u.Set(") u.Set(") u.Set(,"mac":"38:a4:ed:fe:99:c8"}` ...

  3. 【技术干货】git常用命令

    2.1 git init语法: git init在当前目录初始化git仓库,适用于尚未使用git管理的项目2.2 git clone语法: git clone <url>例如: git c ...

  4. 请小心使用 ng-repeat 中的 $index

    自己自学的时候,遇到$index不知道它是如何使用的,所以上网搜了一下,发现了这个关于使用$index可能会出现的一个小BUG,和大家分享一下 PS:我是小白,欢迎指正,非常感谢! 以下是全文: &q ...

  5. springboot入门_helloworld

    开始学习springboot,在此做记录,有不正确之处,还望读者指正. springboot框架的设计目的是用来简化新Spring应用的初始环境搭建以及开发过程.主要体现有:1 xml配置文件,使用s ...

  6. sqlsever 科学计数法 转标准值

    一.解决方案 2e-005 转成 0.00002 update 表名 set 列名=cast(列名 as float) as decimal(19,5)) where 列名 like  '%e%' 如 ...

  7. bzoj 2073 暴力

    2073: [POI2004]PRZ Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 442  Solved: 327[Submit][Status][D ...

  8. Servlet中文乱码问题解决办法

    首先对于源jsp网站和servlet里面的字符集要一样,一般支持中文的字符集为UTF-8最好采用这个字符集(除此之外还有gb2312); 对于源jsp文件的代码中需要设置 设置你的page里面的字符集 ...

  9. java8 - IO

    一.学习大纲: 1. 字符编码格式 2. 文件操作(实现文件的增.删.改.查等操作) 3. 目录操作(实现目录的增.删.改.查等操作) 4. 数据传输(实现对文件内容的读.写等操作) 二.关联类: 1 ...

  10. 情景linux--如何摆脱深路径的频繁切换烦恼?

    情景 通常情况下,在linux系统上切换目录的成本很低,使用cd命令就可以了.如果需要在一个目录的不同的子目录和其父目录之间切换,进入到这个目录之后,再使用相对路径会比较方便.如果要切换的目录的路径较 ...