day10++

70 阅读1分钟

在长沙学院举办了一场数学竞赛,参赛者们来自不同的学院和年级。比赛的主题是计算数的因子求和的值。主持人宣布比赛规则后,参赛者们开始认真思考,他们必须在规定时间内计算出 111 到 nnn 之间所有数的因子求和的值。

比赛场上,有一位学生名叫小迪,他来自计算机科学系,他一直对数学很感兴趣,尤其是在计算因子求和的值方面。小迪一直在思考如何优化计算因子求和的值的算法,他希望能够在比赛中获胜。

但是他由于他脑子不太好,并不会求解这个题。他想到他之前的一个“捞钱杯车队”群,在群里V大伙 505050 红包吃KFC,问题几经转手到了你的手里,你能帮助他求解这个题吗?

计算 111 到 nnn 所有数字的因子之和,由于答案可能过大,所以输出它对 100000000710000000071000000007 取模的结果。

输入描述:

一行,一个正整数 n(1≤n≤1014)n (1\leq n \leq 10^{14})n(1≤n≤1014)。

输出描述:

 一行,一个正整数表示答案。

示例1

输入

复制 6

6

输出

复制 33

33

#include using namespace std; const int mod = 1e9 + 7; typedef long long ll; ll n; ll sum(ll n) { ll ans = 0; for (ll l = 1, r; l <= n; l = r + 1) { r = n / (n / l); ans = (ans + (n / l) % mod * ((r - l + 1) % mod) % mod * ((l + r) % mod) % mod * 500000004 % mod) % mod; } return ans; } int main() { cin >> n; cout << sum(n); return 0;