牛客小白月赛9
A.签到
题目描述
你在一栋楼房下面,楼房一共有n层,第i层每秒有pi的概率会扔下一个东西并砸到你
求第一秒内你被砸到的概率
求第一秒内你被砸到的概率
输入描述:
第一行一个整数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 项为 Ai
设
换句话说:
求 1~n 的全排列的 f 的和,答案对 2 取模
设
换句话说:
求 1~n 的全排列的 f 的和,答案对 2 取模
输入描述:
第一行输入一个整数 T,表示数据组数
之后 T 行,第 i+1 行有一个整数 n_i ,表示第 i 次询问
输出描述:
一共 T 行,第 i 行有 1 个整数,表示第 i 次询问的答案
示例1
输入
1 3
输出
0
说明
备注:
数据范围
1 ≤ n ≤ 1018
1 ≤ T ≤ 10
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 }