제출 #4880

#제출 시각아이디문제언어결과실행 시간메모리
4880ainta홀-짝 수열 (IZhO11_oddeven)C++98
100 / 100
0 ms1092 KiB
#pragma warning(disable:4996)
#include<stdio.h>
char p[110];
int w[150], L;
void Do(int *a){
	int i;
	for (i = 0; i < 133; i++){
		if (a[i] < 0)a[i] += 10, a[i + 1]--;
		if (a[i] > 9)a[i + 1] += a[i]/10, a[i] %= 10;
	}
}
void plusminus(int *T, int *a, int *b, bool k){
	int i;
	for (i = 0; i <= 130; i++){
		if (k)T[i] = a[i] - b[i];
		else T[i] = a[i] + b[i];
	}
	Do(T);
}
void div2(int *a){
	int i;
	for (i = 130; i >= 0; i--){
		if (i && (a[i] & 1))a[i - 1] += 10;
		a[i] >>= 1;
	}
}
void mul(int *T, int *a, int *b){
	int i, j;
	for (i = 0; i <= 130; i++)T[i] = 0;
	for (i = 0; i <= 130; i++){
		for (j = 0; i + j <= 130; j++){
			T[i + j] += a[i] * b[j];
		}
	}
	Do(T);
}
bool Isbigger(int *a, int *b){
	int i, t;
	for (i = 130; i >= 0; i--){
		t = a[i] - b[i];
		if (!t)continue;
		if (t > 0)return true;
		return false;
	}
	return true;
}
int B[150], E[150], T1[150], T2[150], T3[150], M[150], R[150];
void Pro()
{
	int i;
	B[0] = 1;
	T2[0] = 1;
	for (i = 0; i < L / 2 + 1; i++)E[i] = 9;
	while (Isbigger(E,B)){
		plusminus(M, B, E, 0);
		div2(M);
		mul(T1, M, M);
		plusminus(T1, T1, M, 0);
		div2(T1);
		if (Isbigger(T1, w)){
			for (i = 0; i <= 130; i++)R[i] = M[i];
			plusminus(E, M, T2, 1);
		}
		else plusminus(B, M, T2, 0);
	}
	return;
}
int main()
{
	int i;
	scanf("%s", p);
	for (i = 0; p[i]; i++);
	L = i;
	for (i = 0; p[i]; i++)w[L - 1 - i] = p[i] - '0';
	Pro();
	mul(T1, R, R);
	mul(T2, R, R);
	plusminus(T1, T1, R, 0);
	div2(T1);
	plusminus(T3, T1, w, 1);
	for (i = 1; i <= 130; i++)T1[i] = 0;
	T1[0] = 2;
	mul(B, T3, T1);
	plusminus(R, T2, B, 1);
	for (i = 130;; i--)if (R[i])break;
	for (i = i; i >= 0; i--)printf("%d", R[i]);
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...