题目来源:蓝桥杯2022初赛 Java A组I题
题目描述
记f(x)为x的所有因数的平方的和。例如:f(12)= 12+22+32+42+62+122。
定义g(n)=f(1)+f(2)+…+f(n)。
给定n, 求g(n)除以10^9 + 7 的余数。
输入格式
输入一行包含一个正整数n。
对于20% 的评测用例,n ≤ 10^5。
对于30% 的评测用例,n ≤ 10^7。
对于所有评测用例,1 ≤ n ≤ 10^9。
额外补充了5组1 ≤ n ≤ 10^12的数据。
输出格式
输出一个整数表示答案g(n)除以10^9 + 7的余数。
输入样例
100000
输出样例
680584257
问题分析
(略)
也许由于额外补充的n,解题程序只能67%,在某网站上是能AC的。
可能需要用分块算法来实现。
AC的C语言程序如下:
/* LQ0147 因数平方和 */
#include
typedef long long LL;
#define S 166666668LL
#define MOD 1000000007LL
int main()
{
int n;
scanf("%d", &n);
LL sum = 0, ans = 0, t;
for (int i = 1, j; i <= n; i = j + 1) {
j = n / (n / i);
t = sum;
sum = j * (j + 1LL) % MOD * (2LL * j + 1) % MOD * S % MOD;
ans = (ans + (n / i) * (sum - t) + MOD) % MOD;
}
printf("%lld\n", ans);
return 0;
}