見出し画像

ABC065-C 備忘録 p.46

itsukiです。
AtCoderの過去問を解いた様子です。解説記事ではありません。

考察の流れ

順列っぽい?
[1] 猿の数と犬の数の差が 2 以上あると どこかで 猿猿 もしくは 犬犬 になってしまうので、その場合は 0
[2] 猿の数と犬の数の差が 1 ならば、多い方を最初と最後に置くと、猿犬猿…犬猿 もしくは 犬猿犬…猿犬 になるので、 N! * M!
[3] 猿の数と犬の数が等しければ、猿犬猿…犬 もしくは 犬猿犬…猿 になるので、( N! * M! ) + ( N! * M! )
#include <stdio.h>
#define MOD 1000000007
#define MAX(x,y)	((x)>(y)?(x):(y))
#define MIN(x,y)	((x)<(y)?(x):(y))
#define ABS(x)		((x)<0 ? -(x):(x))
typedef long long ll;
ll _fact(ll r){ ll ans=1; for(ll i=1;i<=r;i++){ ans=ans*i%MOD; } return ans; }
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	if( ABS(n-m) >= 2 ){ printf("0\n"); return 0; }  // [1]

	ll ans=0;
	if( n==m ){ ans = ( _fact(n) * _fact(m) %MOD ) *2 %MOD; }  // [3]
	else	  { ans = ( _fact(n) * _fact(m) %MOD );			}  // [2]
	printf("%lld\n",ans);
	return 0;
}

まとめ

・順列と組み合わせを再履修した後だったので、割とすんなり方針を立てられた
・mod と聞くと身構えてしまう。都度 mod し忘れないように注意

引き続き、のんびり精進します。

#備忘録 #AtCoder #ABC #プログラミング #競プロ #C言語

この記事が気に入ったらサポートをしてみませんか?