結果
問題 | No.665 Bernoulli Bernoulli |
ユーザー |
![]() |
提出日時 | 2018-03-09 23:03:57 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 459 ms / 2,000 ms |
コード長 | 2,349 bytes |
コンパイル時間 | 1,849 ms |
コンパイル使用メモリ | 165,224 KB |
実行使用メモリ | 8,420 KB |
最終ジャッジ日時 | 2024-10-10 11:19:21 |
合計ジャッジ時間 | 9,442 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 15 |
ソースコード
#include<bits/stdc++.h>using namespace std;using Int = long long;#define MOD 1000000007#define MAX_P 200005Int fact[MAX_P],inv[MAX_P],finv[MAX_P];;Int extgcd(Int a,Int b,Int& x,Int& y){Int d=a;if(b!=0){d=extgcd(b,a%b,y,x);y-=(a/b)*x;}else{x=1;y=0;}return d;}Int mod_inverse(Int a,Int mod){Int x,y;extgcd(a,mod,x,y);return (mod+x%mod)%mod;}Int mod_pow(Int x,Int n,Int mod){Int res=1;while(n){if(n&1) (res*=x)%=mod;(x*=x)%=mod;n>>=1;}return res;}Int mod_inverse2(Int a,Int mod){return mod_pow(a,mod-2,mod);}void init(Int mod){fact[0]=1;for(Int i=1;i<MAX_P;i++)fact[i]=(fact[i-1]*i)%mod;inv[1]=1;for(Int i=2;i<MAX_P;i++)inv[i]=inv[mod%i]*(mod-mod/i)%mod;finv[0]=1;for(Int i=1;i<MAX_P;i++)finv[i]=finv[i-1]*inv[i]%mod;}Int mod_fact(Int n,Int mod,Int& e){e=0;if(n==0) return 1;Int res=mod_fact(n/mod,mod,e);e+=n/mod;if(n/mod%2!=0)return res*(mod-fact[n%mod]) %mod;return res*fact[n%mod]%mod;}Int mod_comb(Int n,Int k,Int mod){if(n==k||k==0) return 1;Int e1,e2,e3;Int a1=mod_fact(n,mod,e1),a2=mod_fact(k,mod,e2),a3=mod_fact(n-k,mod,e3);if(e1>e2+e3) return 0;return a1*mod_inverse(a2*a3%mod,mod)%mod;}Int mod_comb2(Int n,Int k,Int mod){Int res=1;for(Int i=0;i<k;i++){res*=(n-i)%mod;res%=mod;res*=mod_inverse(i+1,mod);res%=mod;}return res;}//only for prime modInt mod_comb3(Int n,Int k,Int mod){if(k<0||k>n) return 0;return fact[n]*finv[k]%mod*finv[n-k]%mod;}Int montmort(Int n,Int mod){Int res=0,inv=1;for(Int k=2;k<=n;k++){(inv*=mod_inverse(k,mod))%=mod;if(k%2) (res+=mod-inv)%=mod;else (res+=inv)%=mod;}for(Int i=1;i<=n;i++)(res*=i)%=mod;return res;}//INSERT ABOVE HEREsigned main(){init(MOD);Int n,k;cin>>n>>k;vector<Int> B(1,1);for(Int i=1;i<=k;i++){Int tmp=0;for(Int j=0;j<i;j++){Int res=mod_comb3(i+1,j,MOD)*B[j]%MOD;if(j&1) res=MOD-res;tmp=(tmp+res)%MOD;}tmp=tmp*mod_inverse2(i+1,MOD)%MOD;if(i&1) tmp=MOD-tmp;B.emplace_back(MOD-tmp);}Int ans=0;for(Int i=0;i<=k;i++){ans+=mod_comb3(k+1,i,MOD)*B[i]%MOD*mod_pow(n%MOD,k+1-i,MOD)%MOD;ans%=MOD;}ans=ans*mod_inverse2(k+1,MOD)%MOD;cout<<ans<<endl;return 0;}