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;
}

Download