/ Модул на разликата в термините - c ++, модул

Модул на разликата в термините - c ++, модул

Като отговор на конкретен проблем, трябва да отпечатам 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=1, p=1000000007 и s е последният ми отговор. Трябва да вземете модула на s във връзка с p.

За големи стойности от n, s става отрицателен. Това се случва, защото стойността на модула се променя. Така че, дори и да c>d, възможно е c%p<d%p, За n=1000000000 и k=25, s=-727999801, Не мога да мисля за подходящо решение.

Отговори:

0 за отговор № 1

-2 % 7 = 5, защото -2 = 7 * (-1) + 5, докато операцията c ++ modulo ще се върне -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 - правилният отговор.