結果
| 問題 |
No.727 仲介人moko
|
| コンテスト | |
| ユーザー |
beet
|
| 提出日時 | 2018-08-24 21:32:57 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 250 ms / 1,000 ms |
| コード長 | 2,701 bytes |
| コンパイル時間 | 1,778 ms |
| コンパイル使用メモリ | 173,232 KB |
| 実行使用メモリ | 73,236 KB |
| 最終ジャッジ日時 | 2024-06-23 06:45:16 |
| 合計ジャッジ時間 | 4,481 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 25 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<Int MOD = 1000000007>
struct Mod{
Int prev=0;
vector<Int> fact,inv,finv;
Mod(){}
Mod(Int n){init(n);}
Int pow(Int x,Int n){
Int res=1;
while(n){
if(n&1) (res*=x)%=MOD;
(x*=x)%=MOD;
n>>=1;
}
return res;
}
Int inverse(Int a){
return pow(a,MOD-2);
}
void init(Int n){
if(prev>=n) return;
prev=n;
fact=inv=finv=vector<Int>(n);
fact[0]=1;
for(Int i=1;i<n;i++)
fact[i]=(fact[i-1]*i)%MOD;
inv[1]=1;
for(Int i=2;i<n;i++)
inv[i]=inv[MOD%i]*(MOD-MOD/i)%MOD;
finv[0]=1;
for(Int i=1;i<n;i++)
finv[i]=finv[i-1]*inv[i]%MOD;
}
Int comb(Int n,Int k){
Int res=1;
for(Int i=0;i<k;i++){
res*=(n-i)%MOD;
res%=MOD;
res*=inverse(i+1);
res%=MOD;
}
return res;
}
//only for prime MOD
Int C(Int n,Int k){
if(k<0||k>n) return 0;
return fact[n]*finv[k]%MOD*finv[n-k]%MOD;
}
Int P(Int n,Int k){
if(k<0||k>n) return 0;
return fact[n]*finv[n-k]%MOD;
}
Int H(Int n,Int k){
return C(n+k-1,n);
}
Int S(Int n,Int k){
Int res=0;
for(Int i=1;i<=k;i++){
Int tmp=C(k,i)*pow(i,n)%MOD;
if((k-i)&1) res+=MOD-tmp;
else res+=tmp;
res%=MOD;
}
res=res*finv[k]%MOD;
return res;
}
Int B(Int n,Int k){
Int res=0;
for(Int j=1;j<=k;j++){
res+=S(n,j);
res%=MOD;
}
return res;
}
vector<vector<Int> > D(Int n,Int m){
vector<vector<Int> > dp(n+1,vector<Int>(m+1,0));
dp[0][0]=1;
for(Int i=0;i<=n;i++){
for(Int j=1;j<=m;j++){
if(i-j>=0) dp[i][j]=(dp[i][j-1]+dp[i-j][j])%MOD;
else dp[i][j]=dp[i][j-1];
}
}
return dp;
}
Int montmort(Int n){
Int res=0,rinv=1;
for(Int k=2;k<=n;k++){
rinv=rinv*inverse(k)%MOD;
if(k%2) res+=MOD-rinv;
else res+=rinv;
res%=MOD;
}
for(Int i=1;i<=n;i++) res=res*i%MOD;
return res;
}
// calculate P(t) from given points in [0,N]
Int LagrangePolynomial(vector<Int> &y,Int t){
Int n=y.size()-1;
init(n+1);
Int num=1;
for(Int i=0;i<=n;i++)
num=num*((t-i)%MOD)%MOD;
Int res=0;
for(Int i=0;i<=n;i++){
Int tmp=(y[i]*num%MOD)*inverse((t-i)%MOD)%MOD;
tmp=tmp*finv[i]%MOD;
tmp=tmp*finv[n-i]%MOD;
if((n-i)&1) tmp=MOD-tmp;
res=(res+tmp)%MOD;
}
return res;
}
};
//INSERT ABOVE HERE
signed main(){
const Int MOD = 1000000007;
Int n;
cin>>n;
Mod<MOD> mod(n*3);
Int ans=mod.fact[n*2]*mod.inverse(mod.pow(2,n))%MOD;
ans=ans*mod.fact[n]%MOD;
cout<<ans<<endl;
return 0;
}
beet