Bzoj1498&1416: [NOI2006]神奇的口袋
什么鬼双倍经验题???
Sol
考虑在第\(k\)次摸到\(y\)的概率
- 如果上次摸到\(y\),目前有\(sum\)个球,\(y\)有\(a[y]\)个,那么概率就是\(\frac{a[y]+d}{sum+d}*\frac{a[y]}{sum}\)
- 如果上次没摸到\(y\),那么概率就是\(\frac{a[y]}{sum+d}*\frac{sum-a[y]}{sum}\)
合在一起就是\(\frac{a[y]}{sum}\)
那么就是直接这样写
# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
const int _(2005);
typedef long long ll;
IL int Input(){
RG int x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}
int t, n, d, a[_], sum;
ll p1 = 1, p2 = 1;
IL ll Gcd(RG ll x, RG ll y){
return !y ? x : Gcd(y, x % y);
}
int main(RG int argc, RG char* argv[]){
t = Input(), n = Input(), d = Input();
for(RG int i = 1; i <= t; ++i) a[i] = Input(), sum += a[i];
for(RG int i = 1, y; i <= n; ++i){
Input(), y = Input();
p1 *= a[y], p2 *= sum;
sum += d, a[y] += d;
}
RG ll d = Gcd(p1, p2);
printf("%lld/%lld\n", p1 / d, p2 / d);
return 0;
}
然后显然要高精度,为防止高精度\(Gcd\)
所以可以直接分解质因数,然后乘法
# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
const int _(2005);
const int __(2e5 + 1);
const int SZ(1e4);
typedef long long ll;
IL int Input(){
RG int x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}
int t, n, d, a[_], sum;
int prime[__], num, isprime[__];
struct Int{
int fac[__], len, a[__];
IL void Add(RG int x){
for(RG int i = 1; i <= num && prime[i] <= x; ++i)
while(!(x % prime[i])) x /= prime[i], ++fac[i];
}
IL void Mul(RG int x){
RG int ud = 0;
for(RG int i = 1; i <= len; ++i)
a[i] = a[i] * x + ud, ud = a[i] / SZ, a[i] %= SZ;
while(ud) a[++len] = ud % SZ, ud /= SZ;
}
IL void Print(){
printf("%d", a[len]);
for(RG int i = len - 1; i; --i) printf("%04d", a[i]);
}
} P1, P2;
IL void Sieve(){
isprime[1] = 1;
for(RG int i = 2; i < __; ++i){
if(!isprime[i]) prime[++num] = i;
for(RG int j = 1; j <= num && i * prime[j] < __; ++j){
isprime[i * prime[j]] = 1;
if(!(i % prime[j])) break;
}
}
}
int main(RG int argc, RG char* argv[]){
Sieve(), P1.len = P2.len = P1.a[1] = P2.a[1] = 1;
t = Input(), n = Input(), d = Input();
for(RG int i = 1; i <= t; ++i) a[i] = Input(), sum += a[i];
for(RG int i = 1, y; i <= n; ++i){
Input(), y = Input();
if(!a[y]) return puts("0/1"), 0;
P1.Add(a[y]), P2.Add(sum);
sum += d, a[y] += d;
}
for(RG int i = 1; i <= num; ++i){
if(P2.fac[i] >= P1.fac[i]) P2.fac[i] -= P1.fac[i], P1.fac[i] = 0;
else P1.fac[i] -= P2.fac[i], P2.fac[i] = 0;
for(RG int j = 1; j <= P1.fac[i]; ++j) P1.Mul(prime[i]);
for(RG int j = 1; j <= P2.fac[i]; ++j) P2.Mul(prime[i]);
}
P1.Print(), putchar('/'), P2.Print();
return puts(""), 0;
}
Bzoj1498&1416: [NOI2006]神奇的口袋的更多相关文章
- BZOJ 1416: [NOI2006]神奇的口袋( 高精度 )
把x1~xn当成是1~n, 答案是不会变的. 然后直接模拟就行了...... P.S 双倍经验... BZOJ1416 && BZOJ1498 -------------------- ...
- ●BZOJ 1416 [NOI2006]神奇的口袋
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1416题解: Pòlya瓦罐模型: 给定罐子里每种颜色的球的个数A[i],按题目要求随机操作若 ...
- 【BZOJ1416/1498】【NOI2006】神奇的口袋(数论,概率)
[BZOJ1416/1498][NOI2006]神奇的口袋(数论,概率) 题面 BZOJ1416 BZOJ1498 洛谷 题面都是图片形式是什么鬼.. 题解 考虑以下性质 1.\(x[1],x[2]. ...
- 神奇的口袋(dp)
有一个神奇的口袋,总的容积是40,用这个口袋可以变出一 些物品,这些物品的总体积必须是40. John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2……an.John可 ...
- [codeup] 2044 神奇的口袋
题目描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中选 ...
- dp 神奇的口袋
有一个神奇的口袋,总的容积是40,用这个口袋可以变出一 些物品,这些物品的总体积必须是40. John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2--an.Joh ...
- 九度OJ 1114:神奇的口袋 (DFS、DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:948 解决:554 题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个 ...
- 九度oj 题目1114:神奇的口袋
题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中 ...
- 百练2755:神奇的口袋(简单dp)
描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中选择一些 ...
随机推荐
- 条目二十四《当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择》
条目二十四<当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择> 当效率至关重要时,应该在map::operator[]和map::insert之 ...
- QRCode简介(收藏)
一.什么是二维码:二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的. 在许多种类的二维条码中,常 ...
- Advanced-REST-client安装
下载得到Advanced-REST-client_v3.1.9.zip:链接:http://pan.baidu.com/s/1c0vUnJi 密码:z34d这里要说明下,目前谷歌浏览器是不允许安装非谷 ...
- 主流服务器虚拟化技术简单使用——Xen(一)
Tips:因为博客园网页布局的原因,部分图片显示不清晰,可以放大网页查看清晰图片. 如果系统使用物理机,需要在BIOS里面开启Intel VT-x(或AMD-V),如果是VMware workstat ...
- LTE
LTE (telecommunication), Long Term Evolution, a telephone and mobile broadband communication standar ...
- HashSet存储过程中如何排除不同的自定义对象?
HashSet HashSet存储过程中如何排除不同的自定义对象? 先看一个小demo public class Demo1 { public static void main(String[] ar ...
- 安装notepad++之后鼠标右键无Edit with notepad++
在鼠标右键上加入使用notepad++编辑 最近发现一个问题在安装完notepad++文本编辑器之后,在一个文本文件上右键有时候并没有出现“使用notepad++编辑的选项”,不用着急可以通过简单地修 ...
- Java基础29-子父类中的成员变量
/* 成员: 1.成员变量 2.函数 3.构造函数 变量: this 代表当前对象的引用 this.变量 首先在本类中找所需要的变量,如果没有找到再父类中找. super 用于访问当前对象的父类成员, ...
- CentOS下MySQL的安装过程
1 查看 CentOS 自带的 mysql 输入命令: rpm -qa | grep mysql 2 将自带的MySQL卸载了 输入命令: rpm -e --nodeps mysql-libs-5.1 ...
- python中lambda,map,reduce,filter,zip函数
函数式编程 函数式编程(Functional Programming)或者函数程序设计,又称泛函编程,是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象.简单来讲,函 ...