b站与各唱各的题解

题目描述

最近炸鸡块君在逛B站时发现了有趣的视频( 当四鸽各个唱个的能完成一首『夜に駆ける』吗?!_哔哩哔哩_bilibili ),这种视频被称作"各唱各的"挑战,基于此,炸鸡块君提出了一种有趣的"各唱各的"游戏,其具体规则如下:

有n位UP主在翻唱一首共m句的歌曲;

n个UP主先各自独立的在不能与其他UP主交流的情况下录制一份唱歌的音频。对于这首歌中的每一句,每个UP主可以选择唱或不唱;

在所有UP主都录制完成后,将这nnn份唱歌的音频合到一起。若在合成后的音频中,某一句歌词所有人都没唱或同时被所有人都唱了,则认为这句唱失败了,否则认为这句唱成功了。

现在,炸鸡块君想知道:假设这nnn位UP主都足够聪明,每位UP主都精通编程且有一台计算速度无限快的超级计算机,但UP主之间不能交流,他们的目标是让成功唱出的句子数尽可能多,求期望唱成功的句子数量对109+7取模的结果。

输入描述:

 

输入第一行是一个整数T(1≤T≤104),测试用例的组数。

每组测试用例包括两个整数n,m(1≤n,m≤109),含义如题面所述。

输出描述:

 

对于每组样例输出一个整数,表示答案对109+7取模的结果。

若你的答案是一个形如p/q​的分数,则应输出p×q−1对109+7取模的结果,之中q−1表示q在模109+7意义下的逆元。

示例1

输入

1
1 100

输出

0

备注:

如果做不出来这题,可以点击题面链接去听听歌,虽然听了之后还是做不出来,但起码听了一首歌,不亏 :)

思路:

1,取模条件下,有很多应用,eg.快速幂,逆元等

2,极端聪明,有超算->折中使期望最大

3,推导:每个句子单人唱的概率为p,所以不行的概率:p^n+(1-p)^n,求导可得1/2时最小

4,用快速幂求逆元,防止指数爆炸

代码:

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long ll;

ll ksm(int a,int b){//快速幂算次方
    ll ans=1;
    while(b){
        if(b&1)ans=ans*a%mod;
        a=1ll*a*a%mod;//a防止过大,要取mod,long long 计算全转换为ll型
        b>>=1;
    }
    return ans;
}
ll ny(ll a){
    return ksm(a,mod-2);
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        ll ans=1;
        ans=(ksm(2,n-1)-1ll)*ny(ksm(2,n-1))%mod*m%mod;
        cout<<ans<<'\n';
        
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值