BZOJ 2751 容易题
題目鏈接:http://61.187.179.132/JudgeOnline/problem.php?id=2751
題意:有一個(gè)數(shù)列A已知對(duì)于所有的A[i]都是1到n的自然數(shù),并且知道對(duì)于一些A[i]不能取哪些值,我們定義一個(gè)數(shù)列的積為該數(shù)列所有元素的乘積,求出所有可能的數(shù)列的積的和。
思路:假設(shè)沒(méi)有限制不能取哪些值,那么答案ans為:
現(xiàn)在有了限制,那么有限制的那些位置不再是1到n的數(shù)字之和,而是除去某些數(shù)字,因此對(duì)于那些位置專門計(jì)算它們的和,再乘起來(lái),沒(méi)有限制的位置設(shè)有x個(gè),則再乘以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);
}
總結(jié)
以上是生活随笔為你收集整理的BZOJ 2751 容易题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 毕业生的商业软件开发之路 --- C#基
- 下一篇: tinyXML笔记