結果

問題 No.84 悪の算盤
ユーザー IL_mstaIL_msta
提出日時 2015-05-31 18:29:16
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 2 ms / 5,000 ms
コード長 6,965 bytes
コンパイル時間 562 ms
コンパイル使用メモリ 67,996 KB
実行使用メモリ 4,508 KB
最終ジャッジ日時 2023-08-03 12:09:33
合計ジャッジ時間 1,293 ms
ジャッジサーバーID
(参考情報)
judge13 / judge11
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,380 KB
testcase_01 AC 1 ms
4,376 KB
testcase_02 AC 2 ms
4,380 KB
testcase_03 AC 2 ms
4,376 KB
testcase_04 AC 1 ms
4,376 KB
testcase_05 AC 2 ms
4,508 KB
testcase_06 AC 2 ms
4,380 KB
testcase_07 AC 2 ms
4,380 KB
testcase_08 AC 1 ms
4,376 KB
testcase_09 AC 1 ms
4,380 KB
testcase_10 AC 2 ms
4,376 KB
testcase_11 AC 2 ms
4,376 KB
testcase_12 AC 2 ms
4,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <iomanip>

#include <algorithm>
#include <string>
/////////
#define REP(i, x, n) for(int i = x; i < n; i++)
#define rep(i,n) REP(i,0,n)
#define P(p) cout<<(p)<<endl;
/////////
typedef long long LL;
typedef long double LD;
/////////
using namespace::std;
/////////
int L[100000];
int mul3(int a,int b,int c,int x,int y,int z,int* ans1,int* ans2,int* ans3){
	*ans1 = 0;
	*ans2 = 0;
	*ans3 = 0;
	
	const int keta = 10000;
	int ans[7];
	int temp;
	ans[0]=0;
	ans[1]=0;
	ans[2]=0;
	ans[3]=0;
	ans[4]=0;
	ans[5]=0;
	ans[6]=0;

	temp = c*z;
	ans[0]  = temp%keta;
	ans[1] += temp/keta;
	
	temp = (b*z+c*y);
	ans[1] += temp%keta;
	ans[2] += (temp/keta)%keta + ans[1]/keta;
		ans[1] = ans[1]%keta;
	ans[3] += (temp/keta)/keta + ans[2]/keta;
		ans[2] = ans[2]%keta;

	temp = (a*z+b*y+c*x);
	ans[2] += temp%keta;
	ans[3] += (temp/keta)%keta + ans[2]/keta;
		ans[2] = ans[2]%keta;
	ans[4] += (temp/keta)/keta + ans[3]/keta;
		ans[3] = ans[3]%keta;

	temp = a*y+b*x;
	ans[3] += temp%keta;
	ans[4] += (temp/keta)%keta + ans[3]/keta;
		ans[3] = ans[3]%keta;
	ans[5] += (temp/keta)/keta + ans[4]/keta;
		ans[4] = ans[4]%keta;

	temp = a*x;
	ans[4] += temp%keta;
	ans[5] += (temp/keta)%keta + ans[4]/keta;
		ans[4] = ans[4]%keta;
	ans[6] += (temp/keta)/keta + ans[5]/keta;
		ans[5] = ans[5]%keta;

	*ans3 = ans[1]*keta + ans[0];
	*ans2 = ans[3]*keta + ans[2];
	*ans1 = ans[5]*keta + ans[4];

	return ans[6];
}
int add3(int a,int b,int c,int x,int y,int z,int* ans1,int* ans2,int* ans3){
	*ans1 = 0;
	*ans2 = 0;
	*ans3 = 0;
	
	const int keta = 10000;
	int ans[7];
	int temp;
	int kuri = 0;
	ans[0]=0;
	ans[1]=0;
	ans[2]=0;
	ans[3]=0;
	ans[4]=0;
	ans[5]=0;
	ans[6]=0;
	
	temp = c+z;
	if(temp < 0){
		temp += keta;
		kuri = 1;
	}else{kuri=0;}
	ans[0]  = temp%keta;
	ans[1] += temp/keta;

	temp = b+y - kuri;
	if( temp < 0){
		temp += keta;
		kuri = 0;
	}else{kuri = 0;}
	ans[1] += temp%keta;
	ans[2] += temp/keta + ans[1]/keta;
	ans[1]  = ans[1]%keta;

	temp = a+x - kuri;
	if( temp < 0){
		temp += keta;
		kuri = 0;
	}else{kuri = 0;}
	ans[2] += temp%keta;
	ans[3] += temp/keta + ans[2]/keta;
	ans[2]  = ans[2]%keta;

	int ans0 = ans[3]/keta;
	ans[3] = ans[3]%keta;

	*ans3 = ans[1]*keta + ans[0];
	*ans2 = ans[3]*keta + ans[2];
	
	return ans0;
}
//4 4 4 4 4 4 ,4 4 4,8 8 8
int add3(int a0,int a1,int a2,
		 int a3,int a4,int a5,
		 int x,int y,int z,int* ans1,int* ans2,int* ans3){
	*ans1 = 0;
	*ans2 = 0;
	*ans3 = 0;
	
	const int keta = 10000;
	int ans[7];
	int temp;
	int kuri = 0;
	ans[0]=0;
	ans[1]=0;
	ans[2]=0;
	ans[3]=0;
	ans[4]=0;
	ans[5]=0;
	ans[6]=0;
	
	temp = a5+z;
	if(temp < 0){
		temp += keta;
		kuri = 1;
	}else{kuri=0;}
	ans[0]  = temp%keta;
	ans[1] += temp/keta;

	temp = a4+y - kuri;
	if( temp < 0){
		temp += keta;
		kuri = 1;
	}else{kuri = 0;}
	ans[1] += temp%keta;
	ans[2] += temp/keta + ans[1]/keta;
	ans[1]  = ans[1]%keta;

	temp = a3+x - kuri;
	if( temp < 0){
		temp += keta;
		kuri = 1;
	}else{kuri = 0;}
	ans[2] += temp%keta;
	ans[3] += temp/keta + ans[2]/keta;
	ans[2]  = ans[2]%keta;

	////////////////
	temp = a2 - kuri;
	if( temp < 0){
		temp += keta;
		kuri = 1;
	}else{kuri = 0;}
	ans[3] += temp%keta;
	ans[4] += temp/keta + ans[3]/keta;
	ans[3]  = ans[3]%keta;
	/////////////////
	temp = a1 - kuri;
	if( temp < 0){
		temp += keta;
		kuri = 1;
	}else{kuri = 0;}
	ans[4] += temp%keta;
	ans[5] += temp/keta + ans[4]/keta;
	ans[4]  = ans[4]%keta;
	//////////////
	temp = a0 - kuri;
	if( temp < 0){
		temp += keta;
		kuri = 1;
	}else{kuri = 0;}
	ans[5] += temp%keta;
	ans[6] += temp/keta + ans[5]/keta;
	ans[5]  = ans[5]%keta;
	//////////////
	////
	//int ans0 = ans[3]/keta;
	ans[3] = ans[3]%keta;

	*ans3 = ans[1]*keta + ans[0];
	*ans2 = ans[3]*keta + ans[2];
	*ans1 = ans[5]*keta + ans[4];
	return ans[6];
}

bool vi(int n,bool top){
	if(top == true){
		if(n == 0){
			return true;
		}
		else{
			cout << n;
			return false;
		}
	}else{
		     if( n >= 10000000){cout << n;}
		else if( n >=  1000000){cout << "0" << n;}
		else if( n >=   100000){cout << "00" << n;}
		else if( n >=    10000){cout << "000" << n;}
		else if( n >=     1000){cout << "0000" << n;}
		else if( n >=      100){cout << "00000" << n;}
		else if( n >=       10){cout << "000000" << n;}
		else				   {cout << "0000000" << n;}
	}
	return false;
}

int main(void){
	cin.tie(0);
	ios::sync_with_stdio(false);
	cout << fixed;//
	//cout << setprecision(7);//

	int R,C;//[1,10^9]
	cin>>R>>C;
	
	int ans0,ans1,ans2,ans3;
	ans0 = 0;
	ans1 = 0;
	ans2 = 0;
	ans3 = 0;
	int tempA,tempB;
	int A[3];
	int B[3];
	A[0]=0;A[1]=0;A[2]=0;
	B[0]=0;B[1]=0;B[2]=0;
	const int keta = 10000;

	if( R%2==0 && C%2==0 ){
		// RC/4
		if(R == C){
			tempA = R/2;
			A[2] = tempA%keta;
			A[1] = (tempA/keta)%keta;
			A[0] = (tempA/keta)/keta;
			tempB = C/2;
			B[2] = tempB%keta;
			B[1] = (tempB/keta)%keta;
			B[0] = (tempB/keta)/keta;
			ans0 = mul3(A[0],A[1],A[2],B[0],B[1],B[2],&ans1,&ans2,&ans3);
		}
		else{
			tempA = R/2;
			A[2] = tempA%keta;
			A[1] = (tempA/keta)%keta;
			A[0] = (tempA/keta)/keta;
			tempB = C;
			B[2] = tempB%keta;
			B[1] = (tempB/keta)%keta;
			B[0] = (tempB/keta)/keta;
			ans0 = mul3(A[0],A[1],A[2],B[0],B[1],B[2],&ans1,&ans2,&ans3);
		}
	}
	else if( R%2 != C%2){
		if(R%2==0){
			//C*R/2
			tempA = R/2;
			A[2] = tempA%keta;
			A[1] = (tempA/keta)%keta;
			A[0] = (tempA/keta)/keta;
			tempB = C;
			B[2] = tempB%keta;
			B[1] = (tempB/keta)%keta;
			B[0] = (tempB/keta)/keta;
			
			ans0 = mul3(A[0],A[1],A[2],B[0],B[1],B[2],&ans1,&ans2,&ans3);
		}else{//C%2==0
			//R*C/2
			tempA = R;
			A[2] = tempA%keta;
			A[1] = (tempA/keta)%keta;
			A[0] = (tempA/keta)/keta;
			tempB = C/2;
			B[2] = tempB%keta;
			B[1] = (tempB/keta)%keta;
			B[0] = (tempB/keta)/keta;
			ans0 = mul3(A[0],A[1],A[2],B[0],B[1],B[2],&ans1,&ans2,&ans3);
		}
	}else{//R%2==C%2==1
		if(R != 1 && C != 1 && R!=C){
			tempA = R/2;
			A[2] = tempA%keta;
			A[1] = (tempA/keta)%keta;
			A[0] = (tempA/keta)/keta;
			tempB = C;
			B[2] = tempB%keta;
			B[1] = (tempB/keta)%keta;
			B[0] = (tempB/keta)/keta;
			ans0  = mul3(A[0],A[1],A[2],B[0],B[1],B[2],&ans1,&ans2,&ans3);

			ans0 += add3(ans1/keta,ans1%keta,
					 ans2/keta,ans2%keta,
					 ans3/keta,ans3%keta,((C/2+1)/keta)/keta,((C/2+1)/keta)%keta,(C/2+1)%keta,&ans1,&ans2,&ans3);
		}else{//R==C 
			//+R/2
			tempA = R/2;
			A[2] = tempA%keta;
			A[1] = (tempA/keta)%keta;
			A[0] = (tempA/keta)/keta;
			tempB = C/2;
			B[2] = tempB%keta;
			B[1] = (tempB/keta)%keta;
			B[0] = (tempB/keta)/keta;
			ans0  = mul3(A[0],A[1],A[2],B[0],B[1],B[2],&ans1,&ans2,&ans3);

			ans0 += add3(ans1/keta,ans1%keta,
					 ans2/keta,ans2%keta,
					 ans3/keta,ans3%keta,((C/2+1)/keta)/keta,((C/2+1)/keta)%keta,(C/2+1)%keta,&ans1,&ans2,&ans3);
		}
	}

	ans0 += add3(ans1/keta,ans1%keta,
				 ans2/keta,ans2%keta,
				 ans3/keta,ans3%keta,0,0,-1,&ans1,&ans2,&ans3);
	bool top = true;
	top = vi(ans0,top);
	top = vi(ans1,top);
	top = vi(ans2,top);
	top = vi(ans3,top);
	if(top == true){
		cout << "0";
	}
	cout << endl;
	return 0;
}
0