B站与各唱各的

3 篇文章 0 订阅
2 篇文章 0 订阅

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

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

有nnn位UP主在翻唱一首共mmm句的歌曲;

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

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

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

输入描述:

 

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

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

输出描述:

 

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

若你的答案是一个形如pq\frac{p}{q}qp​的分数,则应输出p×q−1p\times q^{-1}p×q−1对109+710^9+7109+7取模的结果,之中q−1q^{-1}q−1表示qqq在模109+710^9+7109+7意义下的逆元。

示例1

输入

复制1 1 100

1
1 100

输出

复制0

0

思路:这个题让求的是期望与逆元。

期望:这个题的每种选法的概率都是一样的,最后只需要个数×概率即可(因为题中没有给我们概率p,p是让我们自己求的,这样大致可以推出来概率是一样的,如果给了p,就有可能每种选法的概率会变化)。因为题上说每句话都唱或者没人唱才为假,所以根据为假情况能推出为真的情况。为假的情况:每句话都是唱与不唱,有n个人选唱与不唱,总情况就是2^n.那么都唱或都不唱的概率都是1/2^n。为真的情况就是1-假。这样就得到了每句话能唱的概率,也就知道了能唱出句子的期望了。

逆元:逆元就是快速幂模板  

 快速幂模板

int qmi(int a,int k)
{
    int res=1;
    while(k)
    {
        if(k&1)res=1ll*res*a%mod;
        k>>=1;
        a=1ll*a*a%mod;//中间乘的时候可能会超过int  *1ll
    }
    return res;
}

 

取余注意事项:

取余时:1.如果两个int相乘,需要在前面加上 1ll* 防止爆int范围。

              2.最好不要超过两个数相乘,三个数相乘会爆long long。

              3.取余遇到减法时,最好在减法后面加上mod再取余,防止减法变成负数(会非常麻烦)

完整代码:

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef long long ll;
const int mod=1e9+7;

ll qmi(ll a,ll k)
{
    ll res=1;
    while(k)
    {
        if(k&1)res=1ll*res*a%mod;
        k>>=1;
        a=1ll*a*a%mod;//中间乘的时候可能会超过int  *1ll
    }
    return res;
}


int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n,m;
        cin>>n>>m;
        ll ans=0;
        ll x=qmi(2, n);
        ll h=(x-2+mod)%mod;
        x=qmi(x, mod-2);
        ans=(h*x)%mod;
        cout<<ans*m%mod<<endl;
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值