题解 P1829 【[国家集训队]Crash的数字表格 / JZPTAB】
分析
首先,设
即
提个
约掉
由
得原式:
合并:
其中
使
即
设
做法
线性筛出
代码
#include <algorithm>
#include <iostream>
using namespace std;
constexpr long long kcz = 20101009;
int v[10000001], p[10000001], pc;
long long g[10000001];
void preproc(int n)
{
g[1] = 1;
for(int i = 2; i <= n; i++)
{
if(!v[i]) p[++pc] = i, g[i] = (1 - i) % kcz;
for(int j = 1; j <= pc && i * p[j] <= n; j++)
{
v[i * p[j]] = true;
if(!(i % p[j]) && (g[i * p[j]] = g[i])) break;
g[i * p[j]] = (g[i] * g[p[j]]) % kcz;
}
}
for(int i = 2; i <= n; i++)
(g[i] = g[i] * i % kcz + g[i - 1]) %= kcz;
}
inline long long s(long long k)
{
return (k * (k + 1) / 2) % kcz;
}
int main()
{
preproc(10000000);
int n, m;
long long ret = 0;
scanf("%d%d", &n, &m);
if(n > m) swap(n, m);
for(int l = 1, r; l <= n; l = r + 1)
{
r = min(n / (n / l), m / (m / l));
(ret += (((s(n / l) * s(m / l)) % kcz) * (g[r] - g[l - 1] + kcz) % kcz) % kcz + kcz) %= kcz;
}
printf("%lld\n", ret);
}