牛客小白月赛9

A.签到

题目描述

你在一栋楼房下面,楼房一共有n层,第i层每秒有p i的概率会扔下一个东西并砸到你
求第一秒内你被砸到的概率

输入描述:

第一行一个整数n
之后有n行,第i+1行有两个整数a_i,b_i,表示 p_i = a_i / b_i.

输出描述:

设答案为 p / q,你只需要找到一个最小的非负整数T,使得 T ≡ p × q^(-1) (mod 1e9+7).
输出这个T就行了
示例1

输入

2
1 2
1 2

输出

750000006

说明

一共只有如下状态:
1. 第一层和第二层都扔了下来
2. 第一层扔了下来
3. 第二层扔了下来
4. 第一层和第二层都没有扔下来
以上四种都是等概率发生的
除了第四种情况外,都会被砸到
因此被砸到的概率是 3/4,这个值在模1e9+7意义下就是750000006

备注:

数据范围
0 ≤ n ≤ 10^5.
1 ≤ a_i ≤ b_i ≤ 10^5.
解题思路:从其对立面来考虑,所有楼层在第一秒内没有扔下东西的概率为tmp=∏(1 - p_i),最终的答案就是(1-tmp)%mod。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL mod=1e9+7;
 5 int n;LL a,b,res;
 6 LL pow_mod(LL a,LL b){
 7     LL ans=1;
 8     while(b){
 9         if(b&1)ans=ans*a%mod;
10         a=a*a%mod;
11         b>>=1;
12     }
13     return ans;
14 }
15 int main(){
16     while(cin>>n){
17         res=1LL;
18         while(n--){
19             cin>>a>>b;
20             res=res*(b-a)%mod*pow_mod(b,mod-2)%mod;
21         }
22         cout<<(1-res+mod)%mod<<endl;
23     }
24     return 0;
25 }

B.法法

题目描述

设 A 是一个 1~n 的排列,其中第 i 项为 A i



换句话说:


求 1~n 的全排列的 f 的和,答案对 2 取模

输入描述:

第一行输入一个整数 T,表示数据组数
之后 T 行,第 i+1 行有一个整数 n_i ,表示第 i 次询问

输出描述:

一共 T 行,第 i 行有 1 个整数,表示第 i 次询问的答案
示例1

输入

1
3

输出

0

说明

1^{(2^{3^{}})}=1\\<br /><br />1^{(3^{2^{}})}=1\\<br /><br />2^{(1^{3^{}})}=2\\<br /><br />2^{(3^{1^{}})}=8\\<br /><br />3^{(1^{2^{}})}=3\\<br /><br />3^{(2^{1^{}})}=9\\

备注:

数据范围
1 ≤ n ≤ 10 18
1 ≤ T ≤ 10
解题思路:枚举前几个答案即可知当n==1或者n==2时,和模数为1,其余情况为0。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 int T;LL n;
 5 int main(){
 6     while(cin>>T){
 7         while(T--){
 8             cin>>n;
 9             if(n==1LL||n==2LL)cout<<1<<endl;
10             else cout<<0<<endl;
11         }
12     }
13     return 0;
14 }

H.论如何出一道水题

题目描述

给定 n,求一对整数 (i,j),在满足 1 ≤ i ≤ j ≤ n 且  gcd(i, j) = 1的前提下,要求最大化 i+j 的值。

输入描述:

第一行一个整数 n

输出描述:

一行一个整数表示答案
示例1

输入

2

输出

3

备注:

数据范围 1≤ n ≤ 10^18.
解题思路:在自然数范围内,相邻两个数一定互质。对于此题,当n==1时,max(i+j)=2,其余情况为n+n-1。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;LL n;
 4 int main(){
 5     while(cin>>n){
 6         if(n==1)cout<<2<<endl;
 7         else cout<<n+n-1<<endl;
 8     }
 9     return 0;
10 }

猜你喜欢

转载自www.cnblogs.com/acgoto/p/9976860.html