繁体   English   中英

数值之和从0到10 ^ 18,模数为10 ^ 9 + 7

[英]Sum of numbers from 0 to 10^18 with modulus 10^9+7

如何找到从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;

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';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM