Very Easy
这道题纯纯简单 高精
唯一难点就是看懂题目的这个点。
给定
这究竟是什么意思?
其实就是:对于给定的
附上一种模板级,超方便的新写法。
它叫:重载运算符。与其说它是他是重载运算符,不如说它是把高精的所有操作封装起来了,注释在代码。
code
# include <bits/stdc++.h>
using namespace std;
const int N = 4e2 + 10;
int n, base;
struct longnum{
int l, d[N];
longnum(){} // 重载标志
longnum(int a){ // 赋值操作
l = 0;
do d[++ l] = a % 10, a /= 10; while(a);
}
longnum(string a){ // 把字符串转化为数字
l = a.size();
for(int i = 1; i <= l; i ++) d[i] = a[l - i] - '0';
}
longnum operator + (longnum oth){ // 重载加法运算
longnum t;
t.l = max(l, oth.l) + 1;
for(int i = l + 1; i <= t.l; i ++) d[i] = 0;
for(int i = oth.l + 1; i <= t.l; i ++) oth.d[i] = 0; // 以上是清空
int num = 0;
for(int i = 1; i <= t.l; i ++){
t.d[i] = d[i] + oth.d[i] + num;
num = t.d[i] / 10;
t.d[i] %= 10;
} // 边计算边进位(很简单)
while(t.l > 1 && t.d[t.l] == 0) t.l --; // 去前缀0
return t; // 一定要返回结果
}
longnum operator * (longnum oth){ // 重载乘法运算
longnum t;
t.l = l + oth.l + 1;
for(int i = 1; i <= t.l; i ++) t.d[i] = 0;
for(int i = l + 1; i <= t.l; i ++) d[i] = 0;
for(int i = oth.l + 1; i <= t.l; i ++) oth.d[i] = 0; // 以上是清空
for(int i = 1; i <= l; i ++)
for(int j = 1; j <= oth.l; j ++)
t.d[i + j - 1] += d[i] * oth.d[j]; // i + j - 1 要注意想
/* 我是先累加的,下面才是进位,这是整个代码最难想的,建议用纸笔模拟*/
int num = 0;
for(int i = 1; i <= t.l; i ++){
t.d[i] += num;
num = t.d[i] / 10;
t.d[i] %= 10;
} // 进位
while(t.l > 1 && t.d[t.l] == 0) t.l --; // 去前缀0
return t; // 一定要返回
}
friend ostream& operator << (ostream &out, longnum a){ // 重载高精度输出流
for(int i = a.l; i >= 1; i --) out << a.d[i];
out << "\n";
return out;
}
friend istream& operator >> (istream &in, longnum &a){ // 重载高精度输入流
string s;
in >> s;
a = s;
return in;
}
}B, ans;
int main(){
while(cin >> n){ // 模拟
scanf("%d", &base); // 底数
ans = 0; // 答案
B = 1; // i次幂
for(int i = 1; i <= n; i ++){ // 计算答案
B = B * base;
ans = ans + B * i;
}
cout << ans;
}
return 0;
}
强烈建议掌握这种写法,太实用了。
最后:别抄题解!别抄题解!别抄题解!