埃氏筛法
根据题意序列 表示
是
的所有因子项的和,即
对于每一个数如果简单判断因子,其复杂度会达到 导致超时。那么我们考虑使用筛法:对于每一个下标
(
),以及所有满足
的整数
,我们将
的值累加到
上。这样,总的操作次数约为
。
由于调和级数的性质,(其中
为欧拉常数,当
时),因此总操作次数约为
。故算法的时间复杂度为
。
AC Code
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, a1, m;
cin >> n >> a1 >> m;
vector<int> ai(n + 1), bi(n + 1);
ai[1] = a1;
for (int i = 2; i <= n; i++)
{
ai[i] = (ai[i - 1] + 7 * i) % m;
}
for (int i = 1; i <= n; i++)
{
for (int j = i; j <= n; j += i)
{
bi[j] += ai[i];
}
}
int xors = bi[1];
for (int i = 2; i <= n; i++)
{
xors ^= bi[i];
}
cout << xors;
return 0;
}

京公网安备 11010502036488号