题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2751
题意:有一个数列A已知对于所有的A[i]都是1到n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,求出所有可能的数列的积的和。
思路:假设没有限制不能取哪些值,那么答案ans为:
现在有了限制,那么有限制的那些位置不再是1到n的数字之和,而是除去某些数字,因此对于那些位置专门计算它们的和,再乘起来,没有限制的位置设有x个,则再乘以sum^x即可。
i64 a[N];
map<int,int> mp;
set<i64> S;
int n,m,K;
i64 mul(i64 a,i64 b)
{
if(b<0) b=(b%mod+mod)%mod;
i64 ans=0;
while(b)
{
if(b&1) ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans;
}
i64 Pow(i64 a,i64 b)
{
i64 ans=1;
while(b)
{
if(b&1) ans=mul(ans,a);
a=mul(a,a);
b>>=1;
}
return ans;
}
int main()
{
RD(n,m,K);
int x,y,id=0;
i64 t;
while(K--)
{
RD(x,y);
t=(i64)x*INF+y;
if(S.find(t)!=S.end()) continue;
S.insert(t);
if(mp.count(x)==0) mp[x]=++id;
(a[mp[x]]+=y)%=mod;
}
i64 ans=1,s=(i64)n*(n+1)/2%mod,i;
FOR1(i,id) ans=mul(ans,s-a[i]);
ans=mul(ans,Pow(s,m-id));
PR(ans);
}