题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2751

题意:有一个数列A已知对于所有的A[i]都是1到n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,求出所有可能的数列的积的和。

思路:假设没有限制不能取哪些值,那么答案ans为:

BZOJ 2751 容易题-LMLPHP

现在有了限制,那么有限制的那些位置不再是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);
}

05-01 03:13