N ^ 2公式的快速模数

时间:2015-05-08 04:37:16

标签: c++ formula

我有一个问题,当我试图解决这个问题时,

  

(1 * 1 + 2 * 2 + ... + n * n)%10234573

我在c ++中的解决方案,

#include <iostream>
#include <cmath>

using namespace std;
int main()
{
    unsigned long long int n, s= 0;
    cin >> n;
    if (n%10234573 == 0)
    {
        cout << 0;
    }
    else
    {
        cout << n*(n+1)*((2*n+1))/6 % 10234573;
    }
    return 0;
}

我需要一个大于10 ^ 9 +快速数字的解决方案。

2 个答案:

答案 0 :(得分:2)

要处理更大的数字问题,我们需要以更有效的方式使用数字10234573

我们知道,对于mod,我们有:

(m*n) mod x = ((m mod x)*(n mod x)) mod x

在我们的计算中使用上述公式:

n*(n+1)*((2*n+1))/6 % 10234573

我们需要摆脱dividing by 6

我们知道要将数字除以6,我们需要将它除以2和3。

所以我们有

unsigned long long int mod = 10234573;

unsigned long long int data[3] = {n, n + 1, 2*n + 1};

bool dividedByTwo = false;
bool dividedByThree = false;

for(int i = 0; i < 3; i++){
    if(data[i] % 2 == 0 && !dividedByTwo){
       data[i]/=2;
       dividedByTwo = true; 
    }
    if(data[i] % 3 == 0 && !dividedByThree){
       data[i]/=3;
       dividedByThree = true; 
    }
}
//Finally, applying mod to our formula
cout<< ((((data[0]%mod)*(data[1]%mod))%mod)*(data[2]%mod))%mod;

答案 1 :(得分:0)

你应该使用模数乘除的分布属性,这样就不会溢出。

(ab) % p = ((a%p) (b%p)) %p

对于3个数字,你得到(使用上面的公式)

(abc) % p = ((ab) c) % p = ((((a%p) (b%p)) %p) (c%p)) %p

因此,不是首先将3个数字相乘,然后是模数,取每个数的模数然后相乘,然后在最后再取模数。