В моем коде я пытаюсь умножить два числа. Алгоритм прост как (k) * (k-1)^nI сохранил произведение (k-1)^n в переменной p1, а затем i умножьте его на k.For n = 10, k = 10 (k-1)^n-1 должно быть 387420489, и я получил это в переменной p1, но при умножении его на k, я получаю отрицательное число. Я использовал modulous, но вместо 3874208490, я получаю другое большое положительное число. Каков правильный подход?переполнение при умножении в C++
#include <iostream>
using namespace std;
typedef long long ll;
ll big = 1000000000 + 7;
ll multiply(ll a, ll b)
{
ll ans = 1;
for (int i = 1; i <= b; i++)
ans = ans * a;
return ans % big;
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
ll n, k;
cin >> n >> k;
ll p1 = multiply(k - 1, n - 1);
cout << p1 << endl; // this gives correct value
ll p2 = (k % big) * (p1 % big);
cout << ((p2 + big) % big) % big << endl;
}
}
Пожалуйста, используйте правильный отступ – MIbrah
'я использовал modulous' - использовать средства проверки орфографии и модуль чаще. – greybeard
К сожалению, это похоже на прыжок на день сатья. У вас есть макрокоманда или код с типом и переменным именем вашего кода в непосредственной непроницаемости. Плохая идея, если вы планируете карьеру в разработке программного обеспечения, и вам придется усложнять работу, если вы хотите выиграть на конкурсе по запуску кода. – user4581301