0至10 ^ 18的模数为10 ^ 9 + 7的数字的总和

sar*_*sal 2 c++ algorithm overflow modular-arithmetic

如何找到0到n模数10 9 + 7 的数字总和,其中n≤10 18

我只想将结果存储在long long int中,而不是存储在数组或字符串中。我的代码导致运行时错误。

const unsigned int m = 1000000007;

long long int n;
cin >> n;
long long int s = 0;
for (long long int i = 0; i < n; i++) {
    s = ((s % m) + (i % m)) % m;
}
cout << s << endl;
Run Code Online (Sandbox Code Playgroud)

Cap*_*nci 7

n个自然数的总和由公式给出n * (n + 1) / 2。因此,您无需遍历n即可计算总和。

由于n可以高达10 18,因此使用计算总和(n * (n + 1) / 2) % MOD将导致整数溢出。取而代之的(a * b) % MOD((a % MOD) * (b % MOD)) % MOD,应使用与相同的模块化算术属性来计算总和。。

因此,可以使用以下公式计算总和: ((n % MOD * (n + 1) % MOD) % MOD) / 2

代码看起来像这样,

const long long int MOD = 1e9 + 7;
long long int n;

cin >> n;

long long s
s = ((n % MOD * (n + 1) % MOD) % MOD) / 2;

cout << s << '\n';
Run Code Online (Sandbox Code Playgroud)