Submission #687700

#TimeUsernameProblemLanguageResultExecution timeMemory
687700divadThe grade (info1cup18_thegrade)C++14
100 / 100
48 ms4196 KiB
#include <bits/stdc++.h> #define int long long #define NMAX 1000002 #define FMAX 100002 #define MOD 1000000007 using namespace std; int fr[NMAX],fact[FMAX],invfact[FMAX],nrperm; int q,p,t,x,n,sum; int lgput(int n, int a){ if(a == 0){ return 1; }else{ if(a%2 == 0){ int val = lgput(n, a/2); return (val*val)%MOD; }else{ return (n*lgput(n, a-1))%MOD; } } } int comb(int n, int m){ return ((fact[n]*invfact[m])%MOD*invfact[n-m])%MOD; } int stars_and_bars(int n, int k){ return comb(n+k-1, k-1); } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> q >> p; fact[0] = 1; invfact[0] = lgput(fact[0], MOD-2); for(int i = 1; i <= q; i++){ fact[i] = fact[i-1]*i; fact[i] %= MOD; invfact[i] = lgput(fact[i], MOD-2); } nrperm = 1; while(q--){ cin >> t >> x; nrperm *= invfact[n]; nrperm %= MOD; if(t == 0){ nrperm *= fact[fr[x]]; nrperm %= MOD; n++; sum += x; fr[x]++; nrperm *= invfact[fr[x]]; nrperm %= MOD; }else{ nrperm *= fact[fr[x]]; nrperm %= MOD; n--; sum -= x; fr[x]--; nrperm *= invfact[fr[x]]; nrperm %= MOD; } nrperm *= fact[n]; nrperm %= MOD; if(sum > p){ /// nu putem sa le distantam cout << "-1\n"; continue; } /// p-sum = cu cate ne putem juca /// nrperm = nr de permutari distincte din A cout << (nrperm * stars_and_bars(p-sum, n+1))%MOD << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...