P8883

· · 题解

写在前面:这是一篇几乎没有任何数论基础的人也能看的懂的题解,因为作者就没有数论基础。

很有趣的一道题,感觉思维难度并没有蓝,看到可以有误差 + 庞大的数据范围,于是一眼看比值。

容易想到,对于每个数,能被 p^2 整除的概率是 \frac{1}{p^2},也就是 p^{-2},因为每 p^2 才会出一个能整除的数。现在我们想求的是至少有一个数能整除完全平方数的概率,那么可以先算出来一个数不能整除完全平方数的概率,也就是 1-p^{-2},然后乘法原理算出所有数都不能整除完全平方数的概率,即为 \prod_{p} \left(1 - p^{-2}\right)。最后再用 1 减一下就好了。

然后感觉这个东西很熟悉,于是把欧拉乘积公式翻了出来:

\sum_{n=1}^{\infty} n^{-s} = \prod_{p} \left(1 - p^{-s}\right)^{-1}

我们把欧拉乘积公式的 s 替换成 2,得

\sum_{n=1}^{\infty} n^{-2} = \prod_{p} \left(1 - p^{-2}\right)^{-1}

然后两边取倒数,得

\frac{1}{\sum_{n=1}^{\infty} n^{-2}} = \prod_{p} \left(1 - p^{-2}\right)

发现右边就是我们想要求的东西。

左边的分母是所有正整数的平方倒数和,等于 \frac{\pi^2}{6},这里不细说了。所以,不含平方因子数的概率为:

\frac{1}{\frac{\pi^2}{6}} = \frac{6}{\pi^2}

由于我们算的是所有数都不能整除完全平方数的概率,所以至少有一个能整除的概率就是

1 - \frac{6}{\pi^2}

最后,将这个概率乘以 n,就可以得到在 1 到 n 范围内存在平方因子数的数的期望数量:

\text{答案} = n \cdot \left(1 - \frac{6}{\pi^2}\right)

代码:

#include <bits/stdc++.h>
using namespace std;
const long double p=acos(-1.0);
int main(){
    long long t,n;
    cin>>t;
    while(t--){
        cin>>n;
        cout<<(long long)(n*(1.0-6.0/p/p))<<endl;
    }
    return 0;
}

再说几句闲话,这题题面有点坑,我一开始理解成了恰好有一个能整除的,所以推出来了个这个式子,不知道对不对,有没有大佬能帮忙看看,可能也许大概收敛于 \frac{3}{8}(猜的)。

\frac{n+1}{2n}\times\sum\limits_{i=2}^n \frac{1}{i^2-1}