术语差异的模数

时间:2018-03-26 12:05:27

标签: c++ modulo

作为特定问题的答案,我必须打印n*k^n - (n-1)*k

for(i=0;i<n;i++){
    c=(c%p*k%p)%p;
    c=(c%p*n%p)%p;
    d=((n-1)%p*k%p)%p;
    s=(c%p-d%p)%p;
    cout<<s<<endl;
}

最初c=1p=1000000007s是我的最终答案。 我必须采用关于p的模数。

对于n的较大值,s变为负数。发生这种情况是因为模数值发生了变化。因此即使c>dc%p<d%p也有可能。对于n=1000000000k=25s=-727999801。我无法想出合适的解决方法。

1 个答案:

答案 0 :(得分:0)

-2 % 7 = 5,因为-2 = 7 * (-1) + 5,而c ++模运算会返回-2,所以要获得正数,您只需要添加p

if (s < 0) s += p;

我建议您按以下方式重写代码:

for (int i = 0; i < n; i++) {
    c = (c * (k % p)) % p;
}
c = (c * (n % p)) % p;
int d = ((n - 1) % p * (k % p)) % p;
int s = (c - d) % p;
if (s < 0) s += p;
cout << s << endl;

要检查一些小输入,您可以使用以下行:

cout << (n * (int)pow(k, n) - (n-1)*k) % p << endl;

尝试使用此输入运行:

const int n = 5;
const int p = 7;
const int k = 10;
int c = 1;

如果没有if (s < 0) s += p;,您会看到-1。这一行将其修复为6 - 正确答案。