結果

問題 No.117 組み合わせの数
ユーザー snrnsidysnrnsidy
提出日時 2021-06-01 04:51:13
言語 C++17
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 140 ms / 5,000 ms
コード長 1,808 bytes
コンパイル時間 2,376 ms
コンパイル使用メモリ 198,368 KB
実行使用メモリ 50,304 KB
最終ジャッジ日時 2024-04-26 09:43:25
合計ジャッジ時間 2,759 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

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

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;

long long int f[3000001];
long long int invf[3000001];
const long long int MOD = 1e9 + 7;
long long int mypow(long long int x,long long int n)
{
	long long int res = 1;
	while(n>0)
	{
		if(n%2==1)
		{
			res = ((res%MOD)*(x%MOD)%MOD);
			res%=MOD;
		}
		x = ((x%MOD)*(x%MOD)%MOD);
		x%=MOD;
		n/=2;
	}
	return res;
}
int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	
	// cin("input");
	//ofstream cout("output");
	int T;
	string s;
	
	f[0] = 1;
	
	for(int i=1;i<=3000000;i++)
	{
		f[i] = ((i%MOD)*(f[i-1]%MOD)%MOD);
		f[i]%=MOD;
	}
	
	invf[3000000] = mypow(f[3000000],MOD-2);
	for(int i=3000000;i>0;i--)
	{
		invf[i-1] = ((invf[i]%MOD)*(i%MOD)%MOD);
		invf[i-1]%=MOD;
	}
	
	cin >> T;
	
	for(int i=1;i<=T;i++)
	{
		cin >> s;
		
		int n = s.length();
		string t = s.substr(2,n-3);
		for(int j=0;j<t.length();j++)
		{
			if(t[j]==',')
			{
				t[j] = ' ';
			}
		}
		stringstream ss;
		long long int N,K;
		ss << t;
		ss >> N >> K;
		//cout << N << ' ' << K << '\n';
		if(s[0]=='C')
		{
			if(N < K)
			{
				cout << 0 << '\n';
				continue;
			}
			long long int res = f[N];
			res = ((res%MOD)*(invf[K]%MOD)%MOD);
			res%=MOD;
			res = ((res%MOD)*(invf[N-K]%MOD)%MOD);
			res%=MOD;			
			cout << res << '\n';
		}
		else if(s[0]=='P')
		{
			if(N < K)
			{
				cout << 0 << '\n';
				continue;
			}			
			long long int res = f[N];
			res = ((res%MOD)*(invf[N-K]%MOD)%MOD);
			res%=MOD;
			cout << res << '\n';
		}
		else
		{
			if(N==0 && K==0)
			{
				cout << 1 << '\n';
				continue;
			}
			long long int n = N + K - 1;
			long long int k = K;
			N = n;
			K = k;
			long long int res = f[N];
			res = ((res%MOD)*(invf[K]%MOD)%MOD);
			res%=MOD;
			res = ((res%MOD)*(invf[N-K]%MOD)%MOD);
			res%=MOD;			
			cout << res << '\n';			
		}
	}
	return 0;
}
0