如何找到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;
答案 0 :(得分: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';