結果
問題 |
No.271 next_permutation (2)
|
ユーザー |
|
提出日時 | 2025-05-24 18:20:37 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 8 ms / 2,000 ms |
コード長 | 1,578 bytes |
コンパイル時間 | 1,378 ms |
コンパイル使用メモリ | 163,620 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-05-24 18:20:40 |
合計ジャッジ時間 | 2,519 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
#include <bits/stdc++.h> #define ll long long #define debug(...) fprintf(stderr,__VA_ARGS__) using namespace std; inline static ll read(){ ll sum=0; int ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) sum=sum*10+(ch^48),ch=getchar(); return sum; } constexpr int mod=1e9+7; int n,a[100005],arr[100005]; ll fac[21]; ll Fac(int n){return fac[min(n,20)];} void update(int p){for(;p<=n;p+=p&-p) arr[p]++;} int query(int p,int ret=0){for(;p;p^=p&-p) ret+=arr[p]; return ret;} ll f(int n){return Fac(n)/2%mod*(n*(n-1ll)/2%mod)%mod;} ll calc(ll k,ll ret=0,int n=1){ while(k>=Fac(n)) n++; n--; for(int i=n,t;~i;i--){ ll _f=Fac(i); t=k/_f,k-=t*_f; ret=(ret+t*(t-1ll)/2*(_f%mod)+t*(f(i)+k))%mod; } return ret; } signed main(){ // freopen("inversion.in","r",stdin); // freopen("inversion.out","w",stdout); n=read(),*fac=1; ll k=read()-1,_k=k+1,zk=0,Ans=0; int p=0,rk_p=0; for(int i=1;i<21;i++) fac[i]=fac[i-1]*i; for(int i=1;i<=n;i++) a[i]=read(); for(int i=n,x;i>=1;update(a[i--])){ ll _f=Fac(n-i); x=query(a[i]),Ans=(Ans+(_k-k)%mod*x)%mod; if(k) if(k<(__int128)(n-i-x)*_f) p=i,zk=k,k=0,rk_p=x; else Ans=(Ans+(x+1ll+n-i)*(n-i-x)/2%mod*(_f%mod)+(n-i-x)*f(n-i))%mod,k-=(n-i-x)*_f; } if(p){ ll _f=Fac(n-p); int x=rk_p,t=zk/_f; zk-=t*_f; Ans=(Ans+(2*x+t+1ll)*t/2%mod*(_f%mod)+zk%mod*(x+t+1ll)+t*f(n-p)+calc(zk))%mod; }else{ ll t=k/Fac(n)*Fac(n); Ans=(Ans+t/2%mod*(n*(n-1ll)/2%mod)+calc(k-t))%mod; } return printf("%lld\n",Ans),0; }