Submission #363929

#TimeUsernameProblemLanguageResultExecution timeMemory
363929ogibogi2004The grade (info1cup18_thegrade)C++14
100 / 100
410 ms10476 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAXN=1e6+6;
const ll mod=1e9+7;
ll fastpow(ll x,ll p)
{
	if(p==0)return 1;
	ll t=fastpow(x,p/2);
	t*=t;t%=mod;
	if(p%2==1)t*=x;
	t%=mod;return t;
}
ll inv(ll x)
{
	return fastpow(x,mod-2);
}
ll fact[MAXN];
ll cnt[MAXN],bigX=1,cntall,sum;
ll comb(ll n,ll k)
{
	if(k>n)return 0;
	ll ret=fact[n];
	ret*=inv(fact[k]);
	ret%=mod;
	ret*=inv(fact[n-k]);
	ret%=mod;
	return ret;
}
void add(ll x)
{
	cntall++;sum+=x;
	bigX*=cntall;
	bigX%=mod;
	cnt[x]++;
	bigX*=inv(cnt[x]);
	bigX%=mod;
}
void remove(ll x)
{
	bigX*=inv(cntall);
	bigX%=mod;sum-=x;
	cntall--;
	bigX*=cnt[x];
	bigX%=mod;
	cnt[x]--;
}
ll q,p;
ll calc()
{
	ll ret=1;
	ret=comb(cntall+p-sum,p-sum);
	ret*=bigX;
	ret%=mod;
	if(ret==0)return -1;
	return ret;
}
void precompute()
{
	fact[0]=1;
	for(ll i=1;i<MAXN;i++)
	{
		fact[i]=fact[i-1]*i;
		fact[i]%=mod;
	}
}
int main()
{
	precompute();
	cin>>q>>p;
	for(int i=0;i<q;i++)
	{
		int type,x;
		cin>>type>>x;
		if(type==1)remove(x);
		else add(x);
		cout<<calc()<<endl;
	}
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...