题目链接:点击这里
题目大意:
有
n
n
n 个人和一个长度为
m
m
m 的序列。每个人对序列的每个元素都可以选或不选,如果某个元素被
0
0
0 或
n
n
n 个人选中就算该元素被删除掉,在人们不互相沟通且做出最优选择的前提下,求该序列剩余元素个数的期望
题目分析:
我们可以发现,对于序列的不同位置,是相互独立的,因此期望就是单个元素的期望乘上
m
m
m 。
因为每个都是在不能互相交流的情况下做出最优选择,所以他们对于同一个元素的选取概率是相同的
不妨设第
i
i
i 个人选该元素的概率为
p
p
p ,因此该元素被删掉的期望(概率)为
p
n
+
(
1
−
p
)
n
p^n+(1-p)^n
pn+(1−p)n (都选择该元素和都没选择两种情况加起来)。因为做的是最优选择,所以大家都希望删除的期望尽可能的小
设
f
(
p
)
=
p
n
+
(
1
−
p
)
n
f(p)=p^n+(1-p)^n
f(p)=pn+(1−p)n ,则
f
′
(
p
)
=
n
p
n
−
1
−
n
(
1
−
p
)
n
−
1
f'(p)=np^{n-1}-n(1-p)^{n-1}
f′(p)=npn−1−n(1−p)n−1
令
f
′
(
p
)
=
0
f'(p)=0
f′(p)=0 得
p
=
0.5
p=0.5
p=0.5 ,易知
f
′
(
p
)
f'(p)
f′(p) 在
(
0
,
0.5
)
(0,0.5)
(0,0.5) 小于
0
0
0 ,在
(
0.5
,
1
)
(0.5,1)
(0.5,1) 大于
0
0
0 ,所以
p
=
0.5
p=0.5
p=0.5 时取得最小值
这时就相当于了每个数只有选与不选两种情况且概率均等,所以总体期望就是:
m
×
2
n
−
2
2
n
m\times\frac{2^n-2}{2^n}
m×2n2n−2
减去了全选和全不选两种情况
具体细节见代码:
//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<unordered_map>
#define ll long long
#define inf 0x3f3f3f3f
#define Inf 0x3f3f3f3f3f3f3f3f
//#define int ll
#define endl '\n'
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
using namespace std;
int read()
{
int res = 0,flag = 1;
char ch = getchar();
while(ch<'0' || ch>'9')
{
if(ch == '-') flag = -1;
ch = getchar();
}
while(ch>='0' && ch<='9')
{
res = (res<<3)+(res<<1)+(ch^48);//res*10+ch-'0';
ch = getchar();
}
return res*flag;
}
const int maxn = 1e6+5;
const int mod = 1e9+7;
const double pi = acos(-1);
const double eps = 1e-8;
int n,m;
int qpow(int a,int b)
{
int res = 1;
while(b)
{
if(b&1) res = 1LL*res*a%mod;
a = 1LL*a*a%mod;
b >>= 1;
}
return res;
}
int main()
{
int t = read();
while(t--)
{
n = read(),m = read();
printf("%d\n",1LL*m*(qpow(2,n)-2+mod)%mod*qpow(qpow(2,n),mod-2)%mod);
}
return 0;
}