题目描述
最近炸鸡块君在逛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;
}