【问题标题】:Sum of numbers from 0 to 10^18 with modulus 10^9+7从 0 到 10^18 的数字之和,模数为 10^9+7
【发布时间】:2019-06-09 20:59:00
【问题描述】:

如何求0到n模109 + 7的数之和,其中n≤1018

我只想将结果存储在 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;

【问题讨论】:

    标签: c++ algorithm overflow modular-arithmetic


    【解决方案1】:

    n 个自然数之和由公式n * (n + 1) / 2 给出。因此,您不需要遍历 n 来计算总和。

    因为,n 可以达到 1018,使用 (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';
    

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多