名校联赛DAY.2A层第三题book(书)题解

时间限制: 1 Sec  内存限制: 512 MB

题目描述

book.in/.out

Hazel有n本书,编号1为n到 ,叠成一堆。当她每次抽出一本书的时候,上方的书会因重力而下落,这本被取出的书则会被放置在书堆顶。

每次有pi的概率抽取编号为i的书。她每次抽书所消耗的体力与这本书在这堆中是第几本成正比。具体地,抽取堆顶的书所耗费体力值为1 ,抽取第二本耗费体力值为2 ,以此类推。

现在 想知道,在很久很久以后(可以认为几乎是无穷的),她每次抽书所耗费的体力的期望值是多少。

最终的答案显然可以表示成a/b的形式,请输出a*(b^-1)模1e9+7的值。

【输入格式】

第一行一个整数n

接下来n行,每行两个整数ai,bi,代表抽取第i本书的概率是ai/bi

保证所有书的概率和等于1

【输出格式】

输出一行一个整数,代表期望值

【输入样例1】

2

227494 333333

105839 333333

【输出样例1】

432679642

【输入样例2】

10

159073 999999

1493 142857

3422 333333

4945 37037

2227 111111

196276 999999

190882 999999

142721 999999

34858 999999

101914 999999

【输出样例2】

871435606

【数据规模与约定】

对于30%的数据,1<=n<=10。

对于100%的数据,1<=n<=1000,0<=ai<=bi,bi!=0。

  首先先吐槽一下这次考试,题目名字就不能正常一点吗?!

  但是这道题确实不容小觑,堂堂名校联赛50多个选手竟然全部爆零,连一个拿暴力分的人都没有,当然包括本蒟蒻,只能呵呵。考试的时候都快绝望了,什么题啊,根本没思路,以为自己完了,想了两个小时,输出个样例完了,天知道大家都挂了。

  然而,WQ大佬成功打出了暴力,然而只能干掉≤9的数据,然而最小的数据正好是10。2333,但还是orz。

  其实这道题的正解真的很水,十分的水,水道比第二题水。

  首先先科普一下,除法无法像加法减法乘法那样取模,在模意义下的除法a*(b^-1)=a/b=a*b的逆元怎么又是它?。

  然后让我们把问题化简一下,如果我们把所有书分开来看的话答案就是拿每本书的期望体力乘以拿这本书的概率的总和,既然在这之中后者是已知的,那我们只要求出来这本书之上有多少本书的期望即可,那么,如果书a在书b之上,那么既然是由于翻了无数次那么a一定比b晚被拿出来,因此这个事件的概率就是a/(a和b被取出来的概率和),于是这道题就搞定了,最后不要忘了加上b自己就在第一个的概率。

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<queue>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<map>
 9 #include<cmath>
10 #include<set>
11 using namespace std;
12 int n,p=1e9+7;
13 long long exgcd(long long a,long long b,long long c){
14     if(a==0)return -1;
15     else if((c%a)==0) return c/a;
16     long long t=exgcd(b%a,a,((-c%a)+a)%a);
17     if(t==-1)return -1;
18     return (t*b+c)/a;
19 }
20 long long a[1005],b[1005];
21
22 int main(){
23     scanf("%d",&n);
24     for(int i=1;i<=n;i++)
25     {
26         scanf("%lld%lld",&a[i],&b[i]);
27         b[i]=exgcd(b[i],p,1);
28         b[i]%=p;
29         a[i]*=b[i];
30         a[i]%=p;
31     }
32     long long ans=0;
33     for(int i=1;i<=n;i++)
34     {
35         long long an=0;
36         for(int j=1;j<=n;j++)
37         {
38             if(j==i) continue;
39             long long x=a[j],y=a[i]+a[j];
40             y=exgcd(y,p,1);
41             y%=p;
42             x*=y;
43             x%=p;
44             an+=x;
45             an%=p;
46         }
47         an++;
48         an*=a[i];
49         an%=p;
50         ans+=an;
51         ans%=p;
52     }
53     printf("%lld\n",ans);
54 //  while(1);
55     return 0;
56 }

时间: 2024-08-06 16:05:45

名校联赛DAY.2A层第三题book(书)题解的相关文章

名校联赛DAY.2A层第一题passward题解

问题 A: Passward 时间限制: 1 Sec  内存限制: 512 MB 题目描述 你来到了一个庙前,庙牌上有一个仅包含小写字母的字符串 s. 传说打开庙门的密码是这个字符串的一个子串 t,并且 t 既是 s 的前缀又是 s的后缀并且还在 s 的中间位置出现过一次. 如果存在这样的串,请你输出这个串,如有多个满足条件的串,输出最长的那一个. 如果不存在这样的串,输出"Just a legend"(去掉引号). 输入格式: 仅一行,字符串 s. 输出格式: 如题所述 样例输入 f

名校联赛DAY.2A层第二题SO(就)题解

问题 B: 就 时间限制: 1 Sec  内存限制: 512 MB 题目描述 就so.in/.out [背景描述] 一排 N 个数, 第 i 个数是 Ai , 你要找出 K 个不相邻的数, 使得他们的和最大. 请求出这个最大和. [输入格式] 第一行两个整数 N 和 K. 接下来一行 N 个整数, 第 i 个整数表示 Ai . [输出格式] 一行一个整数表示最大和, 请注意答案可能会超过 int 范围 [样例输入] 3 2 4 5 3 [样例输出] 7 [数据范围] 对于 20% 的数据, N,

SHU 第15届上海大学程序设计联赛夏季赛[热身赛] 第三题(G题) - 英语成绩

看完题目就觉得是个图论题-- 每个人的成绩就是vertice,两个人的分数差就是edge,那么肯定类似于一种relax的方式,不断将每个人的成绩的min往上提, 当然,单纯的遍历一遍G.E肯定不可能就得到yaoge成绩min的最大值,所以直觉上就想到了bellman-ford,写了一发交了就过了 1 #include<cstdio> 2 int n,p,q; 3 int score[105]; 4 struct Edge{ 5 int high,low,delta; 6 }edge[1005]

9.27考试 SD_le NOIP模拟题 第三题 建造游乐场题解

这道题当时没读完题时脑部了无数种问法,然而最后还是猝不及防.一开始还以为是结论题,然而死也退不出来,就先去打第二题了.然后在想这道题时,我想到的是这样的思路(由于当时时间紧迫,尚未完善): 我每次向图中增加两个点,那么这两个点对于所有入度为偶数的点是否连接一定是一致的,如果这两个点相连,那么如果使他们分别和一个入度为单数的点相连,那么他们就是新的入度为单数的点,其他情况就不叙述了,太多了.还不是正解. 由于最后时间太紧迫了,我不得不打暴力去保分,结果还好丢人好丢人的打错了-- 正解其实还是挺有意

bzoj 2752 9.20考试第三题 高速公路(road)题解

2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1545  Solved: 593[Submit][Status][Discuss] Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1

【基础练习】【卡特兰数】栈 2003年NOIP全国联赛普及组第三题 题解

卡特兰数,这是一向掌握不大熟练的内容,今天借NOIP2003普及组的第三题来总结一下.当然由于原题数据弱抱,不需要高精.如果有时间我会不断补充这篇文章里的内容. 二话不说上代码 //Catalan #include<iostream> using namespace std; long long n,f[20]={0}; /*NO.1 f[n+1]=f[i]*f[n-i]from 0 to n plus f[0]=1 int main(){ cin>>n; f[0]=1;f[1]=

树套树三题 题解

1.COGS 1534 [NEERC 2004]K小数 其实是主席树裸题…… (其实这题数据非常水……从O(nlogn)的主席树到O(nlog3n)的树套树+二分到O(nsqrt(n)log2n)的分块套二分套二分到O(n2)的暴力都能过……) 鉴于这就是动态排名系统的静态版,就不说了,贴代码: 线段树套平衡树: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; con

MSC阿里比赛第三题详解

第三题的分析过程 图/文 听鬼哥说故事 这道题想起来上次阿里的比赛的ali400.apk,虽然没参加,不过看到过网上的几篇分析文章. 第三题主要是壳子方面的问题,脱壳,再分析看看核心代码在java层还是so层即可. 文章写的详细了点,可以留给初学者参考使用. 详细还是查看文档吧,非常详细的调试过程和思路: 链接:http://pan.baidu.com/s/1bnpkWzl 密码:roii

经典算法题每日演练——第三题 猴子吃桃

原文:经典算法题每日演练--第三题 猴子吃桃 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多少个桃子? 分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了. 令S10=1,容易看出 S9=2(S10+1), 简化一下 S9=2S10+2 S8=2S