# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
345504 | nicolaalexandra | 홀-짝 수열 (IZhO11_oddeven) | C++14 | 2054 ms | 364 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define DIM 500
using namespace std;
int a[DIM],aux[DIM],aux2[DIM],sol[DIM],ans[DIM],st[DIM],dr[DIM],mid[DIM],unu[3];
char s[DIM];
int i;
void adunare (int a[], int b[], int c[]){
int m;
if (a[0] > b[0]){
m = a[0];
for (int i=b[0]+1;i<=m;i++)
b[i] = 0;
} else {
m = b[0];
for (int i=a[0]+1;i<=m;i++)
a[i] = 0;
}
int t = 0;
for (int i=1;i<=m;i++){
c[i] = a[i] + b[i] + t;
t = c[i] / 10;
c[i] %= 10;
}
c[0] = m;
while (t){
c[++c[0]] = t%10;
t /= 10;
}
}
void inmultire (int a[], int b[], int c[]){
for (int i=1;i<=a[0] + b[0];i++)
c[i] = 0;
c[0] = a[0] + b[0] - 1;
for (int i=1;i<=a[0];i++)
for (int j=1;j<=b[0];j++)
c[i+j-1] += a[i] * b[j];
int t = 0;
for (int i=1;i<=c[0];i++){
c[i] += t;
t = c[i] / 10;
c[i] %= 10;
}
while (t){
c[++c[0]] = t%10;
t /= 10;
}
}
void impartire (int a[], int b){
int r = 0;
for (int i=a[0];i>=1;i--){
r = r * 10 + a[i];
a[i] = r / b;
r %= b;
}
while (a[0] > 1 && !a[a[0]])
a[0]--;
}
void scadere (int a[], int b[]){ /// a - b
for (int i=b[0]+1;i<=a[0];i++)
b[i] = 0;
int t = 0;
for (int i=1;i<=a[0];i++){
a[i] = a[i] - (b[i] + t);
if (a[i] < 0)
t = 1;
else t = 0;
if (t)
a[i] += 10;
}
while (a[0] > 1 && !a[a[0]])
a[0]--;
}
int compare (int a[], int b[]){ /// a <= b
if (a[0] < b[0])
return 1;
if (a[0] > b[0])
return 0;
for (int i=a[0];i>=1;i--){
if (a[i] < b[i])
return 1;
if (a[i] > b[i])
return 0;
}
return 2; /// egale
}
void copiere (int a[], int b[]){
for (int i=0;i<=b[0];i++)
a[i] = b[i];
}
void scadere1 (int a[]){
int i = 1;
while (i <= a[0] && !a[i]){
a[i] = 9;
i++;
}
a[i]--;
if (i == a[0] && !a[i])
a[0]--;
}
int main (){
//ifstream cin ("date.in");
//ofstream cout ("date.out");
cin>>s+1;
int n = strlen (s+1);
for (i=1;i<=n;i++)
a[n-i+1] = s[i] - '0';
a[0] = n;
if (n == 1 && a[1] == 1){
cout<<1;
return 0;
}
if (n == 1 && a[1] == 2){
cout<<2;
return 0;
}
if (n == 1 && a[1] == 3){
cout<<4;
return 0;
}
for (i=1;i<=n/2+1;i++)
dr[++dr[0]] = 9;
st[0] = st[1] = 1;
unu[0] = unu[1] = 1;
while (compare(st,dr)){
adunare (st,dr,mid);
impartire (mid,2);
inmultire (mid,mid,aux);
adunare (mid,aux,aux);
impartire (aux,2);
if (compare(aux,a) == 1){
copiere (sol,mid);
adunare (mid,unu,st);
/// st = mid+1;
} else { /// dr = mid-1;
copiere (dr,mid);
scadere1 (dr);
}
}
adunare (a,a,ans);
scadere (ans,sol);
scadere1 (ans);
for (i=ans[0];i;i--)
cout<<ans[i];
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |