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 し忘れないように注意
引き続き、のんびり精進します。
この記事が気に入ったらサポートをしてみませんか?