QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#402549 | #4274. $2x + 2$ | I_Love_Sonechka# | WA | 1ms | 4100kb | C++17 | 3.0kb | 2024-04-30 21:15:14 | 2024-04-30 21:15:14 |
Judging History
answer
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
// c++ short types
#define vt vector
typedef long long ll;
typedef long double ld;
void whattime() { cout << "finished in " << clock() * 1.0 / CLOCKS_PER_SEC << " sec" << endl; }
const ll inf = 1e18;
const int base = 1e9;
typedef vt<int> lnum;
void print(lnum a) {
printf("%d", a.empty() ? 0 : a.back());
for(int i = a.size()-2; i >= 0; --i) {
printf("%9d", a[i]);
}
}
lnum read() {
string s; cin >> s;
lnum a;
for(int i = s.length(); i > 0; i -= 9) {
if(i < 9) {
a.push_back(atoi(s.substr(0, i).c_str()));
} else {
a.push_back(atoi(s.substr(i-9, 9).c_str()));
}
}
return a;
}
void add(lnum &a, lnum b) {
int carry = 0;
for(int i = 0; i < max(a.size(), b.size()) || carry; ++i) {
if(i == a.size()) {
a.push_back(0);
}
a[i] += carry + (i < b.size() ? b[i] : 0);
carry = a[i] >= base;
if(carry) {
a[i] -= base;
}
}
}
void subtract(lnum &a, lnum b) {
int carry = 0;
for (size_t i=0; i<b.size() || carry; ++i) {
a[i] -= carry + (i < b.size() ? b[i] : 0);
carry = a[i] < 0;
if (carry) a[i] += base;
}
while (a.size() > 1 && a.back() == 0)
a.pop_back();
}
void divide(lnum &a, int b) {
int carry = 0;
for(int i = a.size() - 1; i >= 0; --i) {
long long cur = a[i] + carry * 1ll * base;
a[i] = (int)(cur / b);
carry = (int)(cur % b);
}
while(not a.empty() && a.back() == 0) {
a.pop_back();
}
}
bool comp(lnum a, int b) {
// ? a >= b
if(a.size() == 0) {
return b == 0;
} else if(a.size() == 1) {
return a[0] >= b;
}
return true;
}
bool comp(lnum a, lnum b) {
if(a.size() < b.size()) {
return false;
} else if(a.size() > b.size()) {
return true;
}
for(int i = a.size() - 1; i >= 0; --i) {
if(a[i] > b[i]) {
return true;
} else if(a[i] < b[i]) {
return false;
}
}
return true;
}
void solve() {
lnum n = read();
if(n == vt<int>(1)) {
cout << "1\n";
return ;
} else if(n == vt<int>(2)) {
cout << "2\n";
return ;
} else if(n == vt<int>(3)) {
cout << "3\n";
return ;
} else if(n == vt<int>(4)) {
cout << 3 << "\n";
return ;
}
lnum value = n;
add(value, {2});
vt<lnum> cnt;
for(int k = 0; k <= 350; ++k) {
if(not comp(value, 3)) {
break;
}
cnt.push_back(value);
// value >= 3
subtract(cnt.back(), {3});
divide(cnt.back(), 2);
divide(value, 2);
}
lnum res = {};
for(int i = cnt.size() - 1; i >= 0; --i) {
lnum delta = cnt[i];
if(i + 1 < cnt.size()) {
subtract(delta, cnt[i+1]);
} else {
add(delta, {+1});
}
for(int j = 1; j <= (i+2) / 2; ++j) {
add(res, delta);
}
}
{
value = n;
add(value, {2});
lnum power = {4};
for(int k = 0; k <= 350; ++k) {
if(not comp(value, power)) {
// (k-1) / 2
add(res, {(k-1+2) / 2});
break;
}
add(power, power);
}
}
print(res);
}
int main()
{
int tt = 1;
for(int t = 0; t < tt; ++t) {
solve();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3740kb
input:
4
output:
3
result:
ok answer is '3'
Test #2:
score: 0
Accepted
time: 0ms
memory: 3740kb
input:
10000000000
output:
6666666667
result:
ok answer is '6666666667'
Test #3:
score: 0
Accepted
time: 0ms
memory: 4100kb
input:
11537
output:
7692
result:
ok answer is '7692'
Test #4:
score: 0
Accepted
time: 1ms
memory: 3744kb
input:
41309
output:
27540
result:
ok answer is '27540'
Test #5:
score: -100
Wrong Answer
time: 1ms
memory: 3772kb
input:
8191927142339937565554845978095081242540169480073285738552305926582959325059543812213073905385467089
output:
5461284761559958377 36563985396720828360112986715523825701537284388639550 39695874808715936923644727
result:
wrong answer expected '546128476155995837703656398539...9550039695874808715936923644727', found '5461284761559958377'