結果
| 問題 |
No.271 next_permutation (2)
|
| コンテスト | |
| ユーザー |
n_vip
|
| 提出日時 | 2015-08-22 00:10:44 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,619 bytes |
| コンパイル時間 | 1,137 ms |
| コンパイル使用メモリ | 99,580 KB |
| 実行使用メモリ | 1,249,080 KB |
| 最終ジャッジ日時 | 2024-07-18 12:25:39 |
| 合計ジャッジ時間 | 7,206 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | MLE * 1 -- * 20 |
ソースコード
#include <string>
#include <vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#include<functional>
#include<list>
#include<deque>
#include<bitset>
#include<set>
#include<map>
#include<unordered_map>
#include<cstring>
#include<sstream>
#include<complex>
#include<iomanip>
#include<numeric>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(X) < (Y);++(X))
#define rrep(X,Y) for (int (X) = (Y)-1;(X) >=0;--(X))
#define repe(X,Y) for ((X) = 0;(X) < (Y);++(X))
#define peat(X,Y) for (;(X) < (Y);++(X))
#define all(X) (X).begin(),(X).end()
#define rall(X) (X).rbegin(),(X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)),(X).end())
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
template<class T> using vv=vector<vector<T>>;
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
os<<"{"; rep(i,t.size()) {os<<t[i]<<",";} os<<"}"<<endl; return os;}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
const ll MOD=1e9+7;
ll ans;
ll fact[30];
ll dfs(vector<int> a,ll t){
if(!t) return 0;
if(a.size()==1) return 1;
//cout<<t<<a<<"----"<<endl;
vector<int> tmp;
int n=a.size();
rep(i,n)if(i)
tmp.pb(a[i]-(a[i]>a[0]));
int few=0;
rep(i,n) few+=a[i]<a[0];
ll re=0;
//cout<<ans<<" -> dfs"<<endl;;
ll ret=re=dfs(tmp,t);
t-=ret;
//cout<<ans<<" -> ";
(ans+=few*ret%MOD)%=MOD;
//cout<<ans<<endl<<ret<<","<<few<<","<<t<<endl;
for(int i=a[0]+1;i<=n;++i){
if(t<fact[n-1]){
vector<int> temp(n-1);
iota(all(temp),1);
ret=dfs(temp,t);
//cout<<ans<<"->";
(ans+=ret*(i-1))%=MOD;
//cout<<ans<<endl;
re+=ret;
break;
}
//cout<<ans<<"->";
(ans+=1ll*(n-1)*(n-2)/2%MOD*fact[n-1]/2%MOD)%=MOD;
(ans+=(i-1)*fact[n-1]%MOD)%=MOD;
//cout<<ans<<"("<<n-1<<")"<<endl;
re+=fact[n-1];
t-=fact[n-1];
}
//cout<<"return!"<<endl;
return re;
}
int main(){
ios_base::sync_with_stdio(false);
cout<<fixed<<setprecision(0);
fact[0]=1;
rep(i,28) fact[i+1]=(i+1)*fact[i];
ll n,t;
cin>>n>>t;
vector<int> a(n),io(n);
rep(i,n)
cin>>a[i];
ll tmp=dfs(a,t);
t-=tmp;
//cout<<ans<<","<<tmp<<endl;
ll hoge=0;
(hoge+=1ll*(n-1)*n/2%MOD*fact[n]/2%MOD)%=MOD;
(ans+=t/fact[n]*hoge%MOD)%=MOD;
iota(all(io),1);
//cout<<io<<t<<","<<t%fact[n]<<endl;
tmp=dfs(io,t%fact[n]);
//cout<<ans<<","<<tmp<<endl;
cout<<ans<<endl;
return 0;
}
n_vip