読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.84 悪の算盤

問題はこちら
No.84 悪の算盤 - yukicoder

R≠Cのとき
回転一致の仕方は2通り
回転により1-based indexの座標により(i,j)で表されるマスは(R+1-i,C+1-j)に移るので
R,Cの少なくとも一方が偶数の時、回転により自身と一致することはない
よってR*C/2-1
R,Cの両方が奇数の時、中心の1点は回転により不変
よって(R*C-1)/2+1-1=floor(R*C/2)

R=Cのとき
回転一致の仕方は4通り
R=Cが偶数の時、回転により自身と一致することはない(十字に4領域でわけると、必ず隣の領域に移る)
よってR*C/4-1
R=Cが奇数の時、中心の1点は回転により不変
よって(R*C-1)/4+1-1=floor(R*C/4)

以上をまとめる

int main(){
	long R,C;
	scanf("%ld%ld",&R,&C);
//	if(R==C){ ←間違い
	if(R!=C){
		if(R*C%2==0)printf("%ld",R*C/2-1);
		else printf("%ld",R*C/2);
	}else{
		if(R*C%2==0)printf("%ld",R*C/4-1);
		else printf("%ld",R*C/4);
	}
	return 0;
}

ところで
R*Cが奇数の時floor(R*C/2)、偶数の時R*C/2-1というのは
floor((R*C-1)/2)とまとめることができる
4で割る時も同様にまとめることができ

n;
main(m){
	scanf("%d%d",&n,&m);
	n=!printf("%ld",1L*n*m-1>>1+(n==m));
}

67B