結果
| 問題 |
No.117 組み合わせの数
|
| ユーザー |
|
| 提出日時 | 2016-05-03 19:08:50 |
| 言語 | Java (openjdk 23) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,228 bytes |
| コンパイル時間 | 2,147 ms |
| コンパイル使用メモリ | 77,760 KB |
| 実行使用メモリ | 57,708 KB |
| 最終ジャッジ日時 | 2024-10-05 05:05:02 |
| 合計ジャッジ時間 | 3,061 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | RE * 1 |
ソースコード
package yukicoder;
import java.util.Arrays;
import java.util.Scanner;
public class Main{
final long mod=1_000_000_000+7;
long[] inv_fact;
long[] fact;
public static void main(String[] args)throws Exception{
new Main().solve();
}
void solve(){
inv_fact=new long[1_000_000+1];fact=new long[1_000_000+1];
inv_fact[0]=1;fact[0]=1;
for(int i=1;i<=1_000_000;i++)fact[i]=(fact[i-1]*i)%mod;
for(int i=1_000_000;i>=1;i--){
if(i==1_000_000){
long a=1;
for(int j=1;j<=i;j++){
a=a*j;
a=a%mod;
}
long inv=inverse_element(a,mod);
while(inv<0)inv+=mod;
inv%=mod;
inv_fact[i]=inverse_element(a, mod);
}else{
inv_fact[i]=((i+1)*inv_fact[i+1])%mod;
}
}
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
for(int i=0;i<t;i++){
String[] a=sc.next().split("[(\\,\\)]");
int n=Integer.parseInt(a[1]);int k=Integer.parseInt(a[2]);
if(a[0].equals("C"))System.out.println(nCk(n,k));
else if(a[0].equals("P"))System.out.println(nPk(n,k));
else if(a[0].equals("H"))System.out.println(nHk(n,k));
}
}
/**
* Verified
* yukicoder No.109
*
* ax=1 mod p
* となる逆元x=a^(-1)を求める。
* pが素数でないときは逆元は存在しない(正しくない値を返す)。
* 拡張ユークリッドの控除法を用いた。
*/
long inverse_element(long a,long p){
return extended_Euclid(1, 0, a, 0, 1, p)[0];
}
/**
*拡張ユークリッドの控除法。
*参考
*http://arc360.info/algo/privatekey.html
*
* extende_Euclid(1,0,a,0,1,b)
* が最初に代入する値。
* ax+by=gcd(a,b)を満たす、(x,y)とgcd(a,b)を
* {x,y,gcd(a,b)}の形で返す。
*/
long[] extended_Euclid(long x0,long y0,long c0,long x1,long y1,long c1){
if(c0<c1)return extended_Euclid(x1,y1,c1,x0,y0,c0);
if(c1==0)return new long[]{x0,y0,c0};
else{
long q=c0/c1;
return extended_Euclid(x1,y1,c1,x0-x1*q,y0-y1*q,c0-c1*q);
}
}
void tr(Object...o){System.out.println(Arrays.deepToString(o));}
long nCk(int n,int k){
return (fact[n]*inv_fact[n-k]*inv_fact[k])%mod;
}
long nPk(int n,int k){
return (fact[n]*inv_fact[n-k])%mod;
}
long nHk(int n,int k){
if(n==0&&k==0)return 1;
else return nCk(n+k-1,k);
}
}