Submission #1350690

#TimeUsernameProblemLanguageResultExecution timeMemory
1350690SmuggingSpunAsceticism (JOI18_asceticism)C++20
100 / 100
23 ms1208 KiB
#include<bits/stdc++.h>
#define taskname "A"
using namespace std;
typedef long long ll;
const int lim = 1e5 + 5;
const int mod = 1e9 + 7;
int power(int a, int b){
  int ans = 1;
  for(; b > 0; b >>= 1, a = ll(a) * a % mod){
    if(b & 1){
      ans = ll(ans) * a % mod;
    }
  }
  return ans;
}
void add(int& a, int b){
  if((a += b) >= mod){
    a -= mod;
  }
}
void sub(int& a, int b){
  if((a -= b) < 0){
    a += mod;
  }
}
int n, k, gt[lim], igt[lim];
int Ckn(int k, int n){
  return ll(gt[n]) * igt[k] % mod * igt[n - k] % mod;
}
namespace sub1{
  void solve(){
    vector<int>p(n);
    iota(p.begin(), p.end(), 0);
    int ans = 0;
    do{
      int cnt = 0;
      for(int i = 1; i < n; i++){
        if(p[i] < p[i - 1]){
          cnt++;
        }
      }
      if(cnt == k){
        ans++;
      }
    } while(next_permutation(p.begin(), p.end()));
    cout << ans;
  }
}
namespace sub23{
  void solve(){
    vector<int>f(n + 1, 0);
    for(int i = f[0] = 1; i < n; i++){
      vector<int>nf(n + 1, 0);
      for(int j = 0; j <= n; j++){
        if(f[j] > 0){
          add(nf[j], f[j]); 
          add(nf[j], ll(j) * f[j] % mod);
          add(nf[j + 1], f[j]);
          add(nf[j + 1], ll(i - j - 1) * f[j] % mod);
        }
      }
      swap(f, nf);
    }
    cout << f[k];
  }
}
namespace sub4{
  void solve(){
    int ans = 0;
    for(int i = 0; i <= k; i++){
      if(i & 1){
        sub(ans, ll(Ckn(i, n + 1)) * power(k + 1 - i, n) % mod);
      }
      else{
        add(ans, ll(Ckn(i, n + 1)) * power(k + 1 - i, n) % mod);
      }
    }
    cout << ans;
  }
}
int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	if(fopen(taskname".inp", "r")){
		freopen(taskname".inp", "r", stdin);
	}
  for(int i = gt[0] = igt[0] = igt[1] = 1; i < lim; i++){
    gt[i] = ll(gt[i - 1]) * i % mod;
  }
  igt[lim - 1] = power(gt[lim - 1], mod - 2);
  for(int i = lim - 2; i > 1; i--){
    igt[i] = ll(igt[i + 1]) * (i + 1) % mod;
  }
  cin >> n >> k;
  if(k-- == 1){
    return cout << 1, 0;
  }
  if(n <= 10){
    sub1::solve();
  }
  else if(n <= 3000){
    sub23::solve();
  }
  else{
    sub4::solve();
  }
}

Compilation message (stderr)

asceticism.cpp: In function 'int main()':
asceticism.cpp:84:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |                 freopen(taskname".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...