---
# System prepended metadata

title: Sum of Divisors
tags: [Meowmeow Online Judge]

---

<style>
html, body, .ui-content {
    background-image: url(https://truth.bahamut.com.tw/s01/201508/7f0e4bd0e01135c9df434733e0d1544a.JPG);
    background-color: #333;
    color: #DDD;
}
</style>

###### tags: `Meowmeow Online Judge`

# Sum of Divisors

## Description
Let $σ(n)$ denote the sum of divisors of an integer $n$. For example, $σ(12)=1+2+3+4+6+12=28$.
Your task is to calculate the sum $\Sigma^n_{i=1}σ(i)$ modulo $10^9+7$ 

## Input
The only input line has an integer $n$.
$1 \leq n \leq 10^{12}$

## Output
Print the the sum $\Sigma^n_{i=1}σ(i)$ modulo $10^9+7$.

## 解題思路
$i$出現的次數是$\lfloor\frac n i\rfloor$，累加$i*\lfloor\frac n i\rfloor$即是答案，但計算每個$i$相當費時
把相同$\lfloor\frac n i\rfloor$和在一起算，只需要算$n$的因數次就好
:::danger
:heavy_exclamation_mark:**注意:** 計算$\frac {a*b} 2 % p$時，不能直接對兩者取餘數，要將除以2改成乘以2的乘法反元素才能對兩者取餘數
:::
### 時間複雜度
$O(\sqrt n)$
詳細證明可以看這篇
https://math.stackexchange.com/questions/1069460/how-many-distinct-values-of-floorn-i-exists-for-i-1-to-n
一個簡易的證明是當head不到根號n時數head，有根號n個，之後數coef，也是根號n個
## Code
```c++
#include <iostream>

const long long modulo = 1'000'000'007;
const long long inverse_of_two = 500'000'004;

int main() {
	long long n;
	std::cin >> n;
	long long answer = 0;
	long long head = 1;
	while (head <= n) {
		long long coef = n / head;
		long long tail = n / coef;
		answer += ((((head + tail) % modulo) * ((tail - head + 1) % modulo) % modulo) * inverse_of_two % modulo) * (coef % modulo) % modulo;
		answer %= modulo;
		head = tail + 1;
	}
	std::cout << answer << std::endl;
	return 0;
}
```
