結果

問題 No.84 悪の算盤
ユーザー IL_msta
提出日時 2015-05-31 18:29:16
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
AC  
実行時間 2 ms / 5,000 ms
コード長 6,965 bytes
コンパイル時間 571 ms
コンパイル使用メモリ 66,844 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-10-13 08:52:24
合計ジャッジ時間 1,175 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 10
権限があれば一括ダウンロードができます

ソースコード

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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0