Address
https://www.lydsy.com/JudgeOnline/problem.php?id=2154
Solution
显然是莫比乌斯反演。
其中 。
发现下取整内的分母是乘积的形式,还是不好做。
所以设 :
再考虑求 。
对于任意的 ,都有:
我们得到: 是积性函数。可以线性筛求。
Code
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define For(i, a, b) for (i = a; i <= b; i++)
#define Step(i, a, b, x) for (i = a; i <= b; i += x)
using namespace std;
const int MaxN = 1e7, N = 1e7 + 5, ZZQ = 20101009;
int n, m, tot, pri[N], zzq[N], ans;
bool mark[N];
void sieve() {
int i, j;
mark[0] = mark[zzq[1] = 1] = 1;
For (i, 2, MaxN) {
if (!mark[i]) zzq[pri[++tot] = i] = 1 - i + ZZQ;
For (j, 1, tot) {
if (1ll * i * pri[j] > MaxN) break;
mark[i * pri[j]] = 1;
if (i % pri[j] == 0) {
zzq[i * pri[j]] = zzq[i];
break;
}
else zzq[i * pri[j]] = 1ll * zzq[i] * zzq[pri[j]] % ZZQ;
}
}
}
int S(int n) {
return (1ll * n * (n + 1) >> 1) % ZZQ;
}
int main() {
int i;
cin >> n >> m;
sieve();
For (i, 1, min(n, m))
ans = (ans + 1ll * i * S(n / i) % ZZQ * S(m / i)
% ZZQ * zzq[i] % ZZQ) % ZZQ;
cout << ans << endl;
return 0;
}