結果
問題 | No.117 組み合わせの数 |
ユーザー | 37zigen |
提出日時 | 2016-05-03 19:08:50 |
言語 | Java21 (openjdk 21) |
結果 |
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 |
(要ログイン)
ソースコード
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); } }