Като отговор на конкретен проблем, трябва да отпечатам 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
- правилният отговор.