Submission #217187

#TimeUsernameProblemLanguageResultExecution timeMemory
217187combi1k1Ruins 3 (JOI20_ruins3)C++14
100 / 100
464 ms3576 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define ld double #define sz(x) (int)x.size() #define all(x) x.begin(),x.end() #define pb emplace_back #define X first #define Y second const int N = 1500; const int mod = 1e9 + 7; void add(int &a,int b) { a += b; if (a >= mod) a -= mod; } void sub(int &a,int b) { a -= b; if (a < 0) a += mod; } int mul(int a,int b) { return 1ll * a * b % mod; } int Pow(int a,int b) { int ans = 1; while (b) { if(b & 1) ans = mul(ans,a); a = mul(a,a); b >>= 1; } return ans; } int inv(int a,int p) { return a == 1 ? 1 : p - 1ll * p * inv(p % a,a) / a; } typedef pair<int,int> ii; int Fac[N]; int Inv[N]; int Ckn(int n,int k) { if (n < k) return 0; if (k < 0) return 0; return mul(Fac[n],mul(Inv[k],Inv[n - k])); } int a[N]; int f[N][N]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); Fac[0] = Inv[0] = 1; for(int i = 1 ; i < N ; ++i) Fac[i] = mul(Fac[i - 1],i); Inv[N - 1] = inv(Fac[N - 1],mod); for(int i = N - 2 ; i ; --i) Inv[i] = mul(Inv[i + 1],i + 1); int n; cin >> n; for(int i = 0 ; i < n ; ++i) cin >> a[i]; f[0][0] = 1; for(int i = 0 ; i < n ; ++i) for(int j = 0 ; j <= n ; ++j) if (f[i][j]) for(int k = 0 ; k <= min(n,a[i] - i - 1) - j ; ++k) { int nxt = f[i][j]; nxt = mul(nxt,Fac[k + k]); nxt = mul(nxt,Inv[k]); nxt = mul(nxt,Ckn(a[i] - i - j - 1,k)); if(!k) nxt = mul(nxt,j - i); add(f[i + 1][j + k],nxt); } int ans = f[n][n]; for(int i = 0 ; i < n ; ++i) ans = mul(ans,500000004); cout << ans << endl; }

Compilation message (stderr)

ruins3.cpp: In function 'int main()':
ruins3.cpp:63:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
     for(int i = 1 ; i < N ; ++i)    Fac[i] = mul(Fac[i - 1],i);     Inv[N - 1] = inv(Fac[N - 1],mod);
     ^~~
ruins3.cpp:63:69: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
     for(int i = 1 ; i < N ; ++i)    Fac[i] = mul(Fac[i - 1],i);     Inv[N - 1] = inv(Fac[N - 1],mod);
                                                                     ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...