結果
問題 | No.573 a^2[i] = a[i] |
ユーザー |
|
提出日時 | 2017-11-04 12:08:29 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 49 ms / 2,000 ms |
コード長 | 1,788 bytes |
コンパイル時間 | 1,680 ms |
コンパイル使用メモリ | 162,500 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-23 05:40:01 |
合計ジャッジ時間 | 3,019 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 47 |
ソースコード
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define REP(i,n) FOR(i,0,n)#define FOR(i,a,b) for(ll i=a;i<b;i++)#define PB push_back#define LB lower_bound#define UB upper_bound#define PQ priority_queue#define UM unordered_map#define ALL(a) (a).begin(),(a).end()#define MOD 1000000007typedef vector<ll> vi;typedef vector<vector<ll>> vvi;const ll INF = (1ll << 30);typedef pair<ll,ll> pii;struct Edge{ ll s,t,c; };typedef vector<vector<Edge>> Graph;typedef vector<pii> vpii;pii extendedEuclid(ll a,ll b){bool swapped=false;if(a<b) {swap(a,b);swapped=true;}pii x={1,0},y={0,1};while(1){ll xv=a*x.first+b*x.second;ll yv=a*y.first+b*y.second;if(yv==0) {if(swapped) return {x.second,x.first}; else return x;}ll d=xv/yv;swap(x,y);y.first-=d*x.first;y.second-=d*x.second;}}ll inverse(ll a,ll mod) {return (mod+extendedEuclid(a,mod).first%mod)%mod;}ll combination(ll a,ll b,ll mod) {ll ret=1;for(ll i=0;i<b;i++) ret=ret*(a-i)%mod;for(ll i=1;i<=b;i++) ret=ret*inverse(i,mod)%mod;return ret;}vi combinations(ll a,ll mod) {vi ret(a+1);ret[0]=1;FOR(i,1,a+1) {ret[i]=ret[i-1];ret[i]=ret[i]*(a-i+1)%mod;ret[i]=ret[i]*inverse(i,mod)%mod;}return ret;}ll power(ll a, ll b, ll mod) {ll tmp=a;ll tmpp=1;ll ret=1;while(1){if(b%(tmpp*2)){ret=ret*tmp%mod;b-=tmpp;}if(b==0) break;tmp=tmp*tmp%mod;tmpp*=2;}return ret;}int main() {ll N; cin>>N;vi a=combinations(N,MOD);ll ans=0;FOR(k,1,N+1) ans=(ans+a[k]*power(k,N-k,MOD))%MOD;cout<<ans<<endl;}