【高精度】高精度冪
阿新 • • 發佈:2018-12-03
問題 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; } /**/