1. 程式人生 > >【高精度】高精度冪

【高精度】高精度冪

問題 D: 【高精度】高精度冪

時間限制: 1 Sec  記憶體限制: 64 MB

題目描述

經過測試,修羅王發現開啟魔法手銬的方法是需要求一個正整數a(1<a<10100)的N(1<N<108)次方,但只要求輸出最後1000位(若不夠1000位,則只輸出實際位數,若超過1000位,即使首位為0也同樣輸出)。

 

輸入

包含兩個數字,即a和N。

 

輸出

輸出結果的最後1000位。

 

樣例輸入

複製樣例資料

2 10

樣例輸出

1024

注意c陣列不能只取1000為萬一第1000為為0不就舍掉了,到最後在輸出1000位

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

int n;
char ans[2005];
int tot;

void solve(char p[], char a[]){
	int c[2005];
	memset(c, 0, sizeof(c));
	int lenp = strlen(p), lena = strlen(a);
	lenp = min(lenp, 1000), lena = min(lena, 1000);
	for (int i = 0; i < lenp; i++){
		for (int j = 0; j < lena; j++){
			c[i + j] += (p[i] - '0') * (a[j] - '0');
			if(c[i + j] > 9){
				c[i + j + 1] += c[i + j] / 10;
				c[i + j] %= 10;
			}
		}
	}
	int cnt = lena + lenp;
	while(c[cnt] == 0 && cnt > 0) cnt--;
	for (int i = 0; i <= cnt; i++){
		p[i] = c[i] + '0';
	}
	p[cnt + 1] = '\0';
	tot = cnt;
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	scanf("%s %d", ans, &n);
	if(!n){
		printf("1\n");
		return 0;
	}
	int id;
	reverse(ans, ans + strlen(ans));
	char p[2005];
	strcpy(p, "1");
	while(n){
		if(n & 1){
			solve(p, ans);
			id = tot;
		}
		solve(ans, ans);
		n >>= 1;
	}
	if(id >= 1000) id = 999;
	for (int i = id; i >= 0; i--){
		printf("%c", p[i]);
	}
	printf("\n");

	return 0;
}
/**/