传送门
思路:
首先注意到句子与句子之间没有办法互相影响,因此答案是一句话的期望 q q q乘以 m m m,由于无法交流,每个人在唱每句(第 i i i句)时唯一的策略就是随机以的概率 p i p_{i} pi决定唱或不唱这一句,又由于 n n n个人之间没有区别,所以不同人的概率一定是相等的,因此 p i ≡ p p_{i}\equiv p pi≡p,因此,唱失败的概率是 p n + ( 1 − p ) n p^{n}+\left( 1-p\right) ^{n} pn+(1−p)n,求其最小值得 p = 1 2 p=\dfrac{1}{2} p=21
所以最终答案为 m ( 1 − ( 1 2 ) n + ( 1 − 1 2 ) n ) = m 2 n − 2 2 n m\left( 1-\left( \dfrac{1}{2}\right) ^{n}+\left( 1-\dfrac{1}{2}\right) ^{n}\right) =m\dfrac{2^{n}-2}{2^{n}} m(1−(21)n+(1−21)n)=m2n2n−2
逆元代码:
const int P = 1e9+7;
int ksm(int x,int k) {
int ans=1;
while (k) {
if (k&1) ans=1ll*ans*x%P;
x=1ll*x*x%P;
k>>=1;
}
return ans;
}
int inv(int x) {
return ksm(x,P-2);
}
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int P = 1e9+7;
int ksm(int x,int k) {
int ans=1;
while (k) {
if (k&1) ans=1ll*ans*x%P;
x=1ll*x*x%P;
k>>=1;
}
return ans;
}
int inv(int x) {
return ksm(x,P-2);
}
void solve(){
int n,m;
scanf("%d%d",&n,&m);
printf("%lld\n",1ll*(ksm(2,n)-2)*inv(ksm(2,n))%P*m%P);
}
int main(){
int t;
scanf("%d",&t);
while (t--) solve();
}