题目
https://ac.nowcoder.com/acm/contest/9982/I
思路
线性筛,大顶分解树后序遍历
代码
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define MAXN 4000010
#define MAXW 100
const LL mod = 1e9 + 7;
LL n, p[MAXN], w[MAXN], vis[MAXN], ans, a[MAXW];
LL dfs(LL x, LL d, LL cd){
LL cnt = 1, tp = vis[x];
for(int i = 0; p[i] > 0 && p[i] <= tp && x*p[i] <= n; i++){
vis[x*p[i]] = p[i];
cnt += dfs(x*p[i], d+cd, w[i]);
}
ans = (ans + cnt*tp%mod*a[d]%mod)%mod;
return cnt;
}
void prime(){
int cnt = 0;
for(int i = 2; i <= n; i++){
if(vis[i] == 0){
p[cnt] = vis[i] = i;
w[cnt] = log10(i)+1;
dfs(i, 0, w[cnt]);
cnt++;
}
}
}
int main(){
a[0] = 1;
for(int i = 1; i < MAXW; i++) a[i] = a[i-1]*10 % mod;
ans = 0, memset(vis, 0, sizeof vis);
scanf("%d", &n);
prime();
printf("%lld\n", ans);
return 0;
}