题目大意:有一排N个白色硬币,每次随机两个数A、B,然后将[min(a,b),max(a,b)]的硬币颜色取反,求M次操作后白色硬币的期望个数,其中 N=1010,M=4000
这是一个很奇怪的做法….
可以考虑算每个硬币最后为白色的概率,即进行了偶数次的操作
对于硬币 i,每次选中它的概率为
p=2i(n−i+1)−1n2
那么最后为白色的概率就是
∑i=0m(mi)pi(1−p)m−i[iiseven]
这是二项式展开的形式
现在设 f 为展开式的奇数项,g 为偶数项,就有
{g+f=(p+1−p)m=1g−f=(p−(1−p))m=(2p−1)m
于是可以得到
g=1+(2p−1)m2
现在考虑 2p−1 的范围,以及 m 非常大,发现其实中间许多项都能使得 (2p−1)m=0 ,所以只要计算出前面不为 0 的部分就好了~
开始算成了黑色我会说…??
【答案】5000624921.38
#include<iostream>
#include<cmath>
#define D long double
#define LL long long
using namespace std;
int main()
{
D ans = 0.0;
LL n = (LL)1e10;
for (int i = 1;i <= 100000000;i ++)
{
D p = (2.0 * i * (n - i + 1) - 1) / n / n;
p = 2.0 * p - 1;
p = pow(p,4000);
ans += (1.0 + p) / 2.0;
}
ans *= 2.0;
ans += 4900000000ll;
printf("%.2f",(double)ans);
return 0;
}