結果
| 問題 | No.271 next_permutation (2) |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-01-27 11:14:45 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 13 ms / 2,000 ms |
| コード長 | 2,195 bytes |
| 記録 | |
| コンパイル時間 | 2,044 ms |
| コンパイル使用メモリ | 215,440 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2026-01-27 11:14:49 |
| 合計ジャッジ時間 | 3,737 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define N 100007
#define mod 1000000007
int a[N],jc[N]={1},f[N];
LL jc_[21]={1};
int n,t[N];
inline void Add(int x,int v){for(;x<=n;x+=x&-x) t[x]+=v;}
inline int Sum(int x){int s=0;for(;x;x-=x&-x) s+=t[x];return s;}
int PreAns(LL k){
int Ans=0;
for(int i=20;i;i--){
LL mtp=jc_[i-1];
int p=k/mtp;k%=mtp;
Ans=(Ans+p*(p-1)/2*1ll*(mtp%mod)%mod)%mod;
Ans=(Ans+p*1ll*f[i-1]%mod)%mod;
Ans=(Ans+(k%mod)*p%mod)%mod;
}
return Ans;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
LL k,Ans0=0;
cin>>n>>k;
if(!k) {cout<<0<<'\n';return 0;}
for(int i=1;i<=n;i++) cin>>a[i],Ans0+=(i-1)-Sum(a[i]-1),Add(a[i],1);
jc[1]=jc_[1]=1;
for(int i=2;i<=20;i++) jc_[i]=jc_[i-1]*i,f[i]=(i*1ll*f[i-1]%mod+i*1ll*(i-1)/2%mod*1ll*(jc_[i-1]%mod)%mod)%mod;
k--;int Ans=Ans0%mod;
if(!k) {cout<<Ans<<'\n';return 0;}
for(int i=n-1;i;i--){
Add(a[i+1],-1);
int now=(a[i]-1)-Sum(a[i]-1);//?a[i]??a[i]??????
Ans0-=now;
if(now==n-i) continue;//???????????
if(n-i>=20){//20!????
Ans0+=now+1;
int last=(k%mod)*(Ans0%mod)%mod;
Ans=(Ans+last)%mod;
Ans=(Ans+PreAns(k))%mod;
cout<<Ans<<'\n';
return 0;
}
LL prs=jc_[n-i+1]-(now+1)*jc_[n-i];//??????
if(k<prs){//?????
Ans=(Ans+(k%mod)*(Ans0%mod)%mod)%mod;//a[i]?????
int tmp=k/jc_[n-i],tmp2=0;
for(int j=now+1;j<=now+tmp;j++) tmp2+=j;//a[i]??????
tmp2=tmp2*1ll*(jc_[n-i]%mod)%mod;//??(n-i)!?
Ans=(Ans+tmp2)%mod;tmp2=0;//a[i]?????
Ans=(Ans+tmp*1ll*f[n-i]%mod);//a[i]???????
k%=jc_[n-i];int now2=now+tmp+1;
if(k) Ans=(Ans+now2*k%mod)%mod,//a[i]??????
Ans=(Ans+PreAns(k))%mod;//a[i]???????
cout<<Ans<<'\n';return 0;
}
k-=prs;
Ans=(Ans+(prs%mod)*(Ans0%mod)%mod)%mod;//a[i]????????
int Minus=((now+1)*1ll*f[n-i]%mod+now*(now+1)/2*1ll*(jc_[n-i]%mod)%mod)%mod;
int Now=(f[n-i+1]+mod-Minus)%mod;//a[i]?????
Ans=(Ans+Now)%mod;//cout<<i<<' '<<prs<<'-'<<Ans<<'\n';
if(!k){cout<<Ans<<'\n';return 0;}
}
if(n<=20){
LL cyc=k/jc_[n];
k%=jc_[n];
Ans=(Ans+(cyc%mod)*f[n]%mod)%mod;
}
if(k) Ans=(Ans+PreAns(k))%mod;
cout<<Ans<<'\n';
return 0;
}
/*
5 10
4 3 2 5 1
10 100
2 4 6 9 10 8 1 5 7 3
*/
vjudge1