//============================================================================
// Name : 1090.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <stdio.h>
#include <vector>
using namespace std;
#define X 1000000000
#define N 1001
int data[N];
int n;
int des[N];
int sum;
int flag[N];
class BigInteger {
private:
vector<int> data;
public:
BigInteger(int number) {
data.push_back(number);
}
void doubleSelf() {
int last = 0;
for (int i = 0; i < data.size(); i++) {
int sum = (data[i] << 1) + last;
if (sum >= X) {
data[i] = sum - X;
last = 1;
} else {
data[i] = sum;
last = 0;
}
}
if (last > 0) {
data.push_back(last);
}
}
void add(const BigInteger& other) {
int last = 0;
for (int i = 0; i < data.size(); i++) {
if (i < other.data.size()) {
int sum = data[i] + other.data[i] + last;
if (sum >= X) {
data[i] = sum - X;
last = 1;
} else {
data[i] = sum;
last = 0;
}
} else {
int sum = data[i] + last;
if (sum >= X) {
data[i] = sum - X;
last = 1;
} else {
data[i] = sum;
last = 0;
}
}
}
for (int i = data.size(); i < other.data.size(); i++) {
int sum = other.data[i] + last;
if (sum >= X) {
data.push_back(sum - X);
last = 1;
} else {
data.push_back(sum);
last = 0;
}
}
if (last > 0) {
data.push_back(last);
}
}
void output() {
printf("%d", data[data.size() - 1]);
for (int i = data.size() - 2; i >= 0; i--) {
printf("%9.9d", data[i]);
}
puts("");
}
};
void calStep(int n) {
if (n < 0) {
return;
}
if (data[n] != des[n]) {
des[n - 1] = 1;
flag[n] = 1;
}
calStep(n - 1);
}
int main() {
scanf("%d", &n);
int lastOne = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &data[i]);
if (data[i]) {
lastOne = i;
}
}
sum = 0;
calStep(lastOne);
BigInteger out(0);
BigInteger temp(1);
for (int i = 0; i <= lastOne; i++) {
if (flag[i]) {
out.add(temp);
}
temp.doubleSelf();
}
out.output();
return 0;
}
poj1090
猜你喜欢
转载自blog.csdn.net/swwlqw/article/details/14448831
今日推荐
周排行