zoukankan      html  css  js  c++  java
  • 牛客小白月赛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 取模

    输入描述:

    第一行输入一个整数 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 ≤ 1018
    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 }
  • 相关阅读:
    一台电脑上的git同时使用两个github账户
    git自己操作命令组集合
    git基本原理
    js如何遍历表单所有控件
    js如何访问表单(四种方法)(博客园+li的方式去掉p标签)
    js如何操作表格(常用属性方法汇总)
    php数学和时间常用函数有哪些(总结表)(看学习视频效率挺高的)(复习)
    swift 笔记 (十九) —— 协议
    ecshop广告调用方法
    K60 启动过程分析
  • 原文地址:https://www.cnblogs.com/acgoto/p/9976860.html
Copyright © 2011-2022 走看看