Задача "Тестирование"
На первой строке вводят количество попыток тестирований N, следующие N линий вводятся числа K и M.
Вывод: на каждой строчке через пробел первые три и последние три цифры результата K^M. Ввод:
2
2 3
3 37
Вывод:
004 004
450 363
Ограничения: 1<= N <= 100000, 1 <= K, M <= 1000000
Мой вариант, проходит тесты но не все, проблема, мне кажется с размером вмещаемым в тип данных, как можно исправить?
#include <iostream>
using namespace std;
int k, firstThree;
long long a;
unsigned long long dpow(unsigned long long N, unsigned long long M) {
if (M == 0) {
return 1;
}
else if (M % 2 == 1) {
return dpow(N, M - 1) * N;
}
else {
unsigned long long temp = dpow(N, M / 2);
return temp * temp;
}
}
void findResult(int store[], unsigned long long result) {
if (result / 10 == 0) {
cout << "00" << result << " " << "00" << result << endl;
}
else if (result / 100 == 0 && result / 10 != 0) {
cout << "0" << result << " " << "0" << result << endl;
}
else if (result / 1000 == 0 && result / 10 != 0 && result / 100 == 0) {
cout << result << " " << result << endl;
}
else {
while (result != 0) {
a = result % 10;
if (k >= 0) {
store[k--] = a;
}
result /= 10;
if (result > 99 && result < 1000) {
firstThree = result;
}
if (k < 0 && firstThree != 0) {
cout << firstThree << " " << flush;
for (int i = 0; i < 3; i++) {
cout << store[i] << flush;
}
cout << endl;
break;
}
}
}
}
int main () {
int T;
unsigned long long N, M;
int* store;
unsigned long long result;
cin >> T;
for (int i = 0; i < T; i++) {
cin >> N >> M;
result = dpow(N, M);
store = new int[3];
firstThree = 0;
k = 2;
findResult(store, result);
delete []store;
}
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Ну, примерно так (только оттестироваться мне было не на чем, да и спешу, мне бежать надо...)
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
//// Быстрое возведение в степень по модулю p
unsigned int iqpow(unsigned int x, unsigned int e, unsigned int p)
{
unsigned int res = 1;
x %= p;
for(;e;e>>=1)
{
if (e&1) res = (res*x)%p;
x = (x*x)%p;
}
return res;
}
void solve(unsigned int K, unsigned int M)
{
string f, l;
double x = M*log10(K);
if (x < 7) // В лоб
{
string s = to_string(iqpow(K,M,1000000000));
f = s.substr(0,3);
l = (s.size() < 3) ? s.substr(0,3) : s.substr(s.size()-3,3);
}
else
{
l = to_string(iqpow(K,M,1000));
x -= floor(x);
f = to_string(pow(10,x)*100).substr(0,3);
}
while(f.size() < 3) f = "0" + f;
while(l.size() < 3) l = "0" + l;
cout << f << " " << l << "\n";
}
int main()
{
int N; cin >> N;
for(int i = 0; i < N; ++i)
{
unsigned int K, M;
cin >> K >> M;
solve(K,M);
}
}