結果

問題 No.117 組み合わせの数
ユーザー Ysmr_RyYsmr_Ry
提出日時 2015-01-05 02:38:57
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 97 ms / 5,000 ms
コード長 1,238 bytes
コンパイル時間 338 ms
コンパイル使用メモリ 44,752 KB
実行使用メモリ 34,236 KB
最終ジャッジ日時 2023-09-03 22:02:06
合計ジャッジ時間 1,007 ms
ジャッジサーバーID
(参考情報)
judge15 / judge12
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 97 ms
34,236 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<cstdio>
#include<cctype>
#include<string>
#define rep(i,a) for(int i=0;i<(a);++i)
#define repd(i,a) for(int i=(a);i>=0;--i)

typedef long long ll;

const ll mod = 1000000007, MAX_N = 2000000;

int T;
ll fact[MAX_N+1], factinv[MAX_N+1];

ll extgcd( ll a, ll b, ll &x, ll &y )
{
	int d = b;

	if( b )
	{
		d = extgcd( b, a%b, y, x );
		y -= a/b*x;
	}
	else
		x = 1, y = 0;

	return d;
}

ll divMod( ll a, ll b, ll m )
{
	ll x, y;
	extgcd( b, m, x, y );

	return ((a*x)%m+m)%m;
}

ll perm( int n, int r )
{ return n<r?0:fact[n]*factinv[n-r] % mod; }

ll comb( int n, int r )
{ return n<r?0:fact[n]*factinv[r] % mod * factinv[n-r] % mod; }

ll homo( int n, int r )
{ return r?comb( n+r-1, r ):1; }

int main()
{
	fact[0] = 1;
	rep( i, MAX_N )
		fact[i+1] = (i+1)*fact[i] % mod;

	factinv[MAX_N] = divMod( 1, fact[MAX_N], mod );
	repd( i, MAX_N-1 )
		factinv[i] = (factinv[i+1]*(i+1)) % mod;

	scanf( "%d", &T );
	rep( i, T )
	{
		char S[41];
		scanf( "%s", S );

		int n, r;
		ll ans = 0;		
		
		if( sscanf( S, "C(%d,%d)", &n, &r ) == 2 )
			ans = comb(n,r);
		if( sscanf( S, "P(%d,%d)", &n, &r ) == 2 )
			ans = perm(n,r);
		if( sscanf( S, "H(%d,%d)", &n, &r ) == 2 )
			ans = homo(n,r);

		printf( "%lld\n", ans );
	}

	return 0;
}
0