# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
932875 | 2024-02-24T10:36:33 Z | parlimoos | Skyscraper (JOI16_skyscraper) | C++14 | 0 ms | 0 KB |
//Be Name KHODA #pragma GCC optimize("Ofast") #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define pb push_back #define pp pop_back #define lb lower_bound #define ub upper_bound #define cl clear #define bg begin #define arr(x) array<int , x> #define endl '\n' const int MOD = int(1e9) + 7; int n , k; vector<int> a; int dp[(1 << 14)][14][101]; void Add(int &e , int b){ e += b; if(e > MOD) e -= MOD; if(e < 0) e += MOD; } int Mul(int a , int b){ return (1ll * a * b) % MOD; } int Pow(int a , int b){ int res = 1; while(b){ if((b & 1)) res = Mul(res , a); a = Mul(a , amsk | ) , b >>= 1; } return res; } void f(){ for(int bit = 0 ; bit < n ; bit++){ dp[(1 << bit)][bit][0] = 1; } for(int msk = 1 ; msk < (1 << 14) ; msk++){ for(int bit0 = 0 ; bit0 < n ; bit0++){ if(((msk >> bit0) & 1)) continue; for(int bit1 = 0 ; bit1 < n ; bit1++){ if(!((msk >> bit1) & 1)) continue; for(int sm = 0 ; sm <= k ; sm++){ if(sm + abs(a[bit0] - a[bit1]) > k) continue; Add(dp[msk | (1 << bit0)][bit0][sm + abs(a[bit0] - a[bit1])] , dp[msk][bit1][sm]); } } } } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin >> n >> k; for(int i = 0 ; i < n ; i++){ int d; cin >> d; a.pb(d); } int o = 0; if(n <= 8){ for(int i = 0 ; i < (8 * 7 * 6 * 5 * 4 * 3 * 2) ; i++){ int sm = 0; for(int j = 1 ; j < n ; j++) sm += abs(a[j] - a[j - 1]); if(sm <= k) o++; next_permutation(a.bg() , a.end()); } }else{ f(); for(int end = 0 ; end < n ; end++){ for(int sm = 0 ; sm <= k ; sm++){ Add(o , dp[(1 << n) - 1][end][sm]); } } } cout << o; }