結果
| 問題 |
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;
}