解法一
🔹 大數計算
「凡是奇數次方和,都是有公式的,而偶數次方和就沒有」
也就是 ,當 是偶數時可以使用某種公式計算
這裡不用搞懂所謂的「公式」到底是甚麼
題目求的是 能不能 使用公式計算
其實就是求 n 是不是偶數
而第二行 兩個數的n次方和 直接算出來即可
數字很大,不能直接計算乘法
參考 a021. 大數運算
然後以快速冪計算次方 :
如果要算 ,可以使用遞迴避免重複的計算
- 當 是偶數,拆成 (這樣只需要計算一遍 )
- 當 是奇數,拆成 (n-1 一定是偶數,又可以回到第 1 點)
- 當 ,迴傳
✅ 完整代碼
評分結果(參考) : AC (2ms, 336KB)
#include <bits/stdc++.h>
using namespace std;
string bigAdd(string a, string b){
int size = max(a.size(), b.size());
string ans;
int x = 0;
for(int i=0; i<size; i++){
int ai = i<a.size() ? a[a.size()-i-1]-'0' : 0;
int bi = i<b.size() ? b[b.size()-i-1]-'0' : 0;
int res = ai + bi + x;
ans += (res%10 + '0');
x = res/10;
}
if(x > 0) ans += (x + '0');
while(ans.size()>1 && ans.back()=='0') ans.pop_back();
reverse(ans.begin(), ans.end());
return ans;
}
string bigMul(string a, string b){
int size = a.size() + b.size();
vector<int> res(size+1, 0);
string ans;
for(int i=0; i<a.size(); i++){
for(int j=0; j<b.size(); j++){
res[i+j] += (a[a.size()-i-1]-'0')*(b[b.size()-j-1]-'0');
}
}
for(int i=0; i<size; i++){
ans += res[i]%10 + '0';
res[i+1] += res[i]/10;
}
while(ans.size()>1 && ans.back()=='0') ans.pop_back();
reverse(ans.begin(), ans.end());
return ans;
}
string bigPow(string a, int n){
if(n == 1) return a;
if(n & 1){
return bigMul(a, bigPow(a, n-1));
}
else{
string temp = bigPow(a, n/2);
return bigMul(temp, temp);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
string a, b;
cin >> n >> a >> b;
if(n & 1){
cout << "能\n";
cout << bigAdd(bigPow(a, n), bigPow(b, n));
}
else cout << "不能";
return 0;
}
Python 解
因為 Python 數字沒有大小限制
真的太好做大數的計算了
✅ 完整代碼
評分結果(參考) : AC (18ms, 3.3MB)
n = int(input())
a, b = list(map(int, input().split()))
if n%2 == 0:
print("不能")
else:
print(f"能\n{(pow(a,n)+pow(b,n))}")