CRUELL - Cô giáo dạy toán, phần I
Tác giả: happyboy99x
Ngôn ngữ: C++
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define BASE 1000000000
struct BigInteger {
int n; long long d[15100];
BigInteger() {
memset(d, 0, sizeof d); n = 0;
}
BigInteger(int x) {
memset(d, 0, sizeof d); n = 0;
for(; x; x /= BASE) d[n++] = x % BASE;
}
void operator += (const BigInteger &x) {
n = max(x.n, n); int rem = 0;
for(int i = 0; i < n; ++i) {
int p = x.d[i] + d[i] + rem;
if(p >= BASE) d[i] = p - BASE, rem = 1;
else d[i] = p, rem = 0;
}
if(rem) d[n++] = rem;
}
BigInteger operator * (const BigInteger &x) {
BigInteger temp, res;
for(int i = 0; i < n; ++i) {
memset(temp.d, 0, sizeof(temp.d[0]) * i); temp.n = i;
long long rem = 0;
for(int j = 0; j < x.n; ++j) {
long long p = d[i] * x.d[j] + rem;
temp.d[temp.n++] = p % BASE;
rem = p / BASE;
}
for(; rem; rem /= BASE) temp.d[temp.n++] = rem % BASE;
res += temp;
}
return res;
}
BigInteger operator ^ (const int x) {
if(x == 0) return BigInteger(1);
BigInteger res = (*this) ^ (x/2);
if(x % 2 == 0) return res * res;
return res * res * (*this);
}
void print() {
char * s = new char[9 * n + 70], * p = s;
int k; sprintf(p, "%d%n", (int) d[n-1], &k); p += k;
for(int i = n-2; i >= 0; --i) sprintf(p, "%09d%n", (int) d[i], &k), p += k;
for(p = s; *p; p += 70) printf("%.70s\n", p);
}
};
int main() {
int a, n; scanf("%d%d",&a,&n);
(BigInteger(a) ^ n).print();
return 0;
}