[codefoces439C]The Intriguing Obsession(组合数学)

来源:互联网 发布:mac os x 10.11黑苹果 编辑:程序博客网 时间:2024/06/06 12:45

C题:

我是超链接

题解:

第一步:考虑至少3意味着什么?

“它们之间最短的距离至少是3”,意思是不能是1或2。距离不能是1,意思是没有两个颜色相同的岛屿可以直接连接。距离不可能是2,这意味着每个岛屿,不能连接两个颜色相同的岛屿。

第二步:把图分成3部分。

红色岛屿和蓝色岛屿之间的桥梁与红色和紫色岛屿之间的桥梁没有任何关系。因此,我们可以把这张图分成3部分:红色和蓝色,蓝色和紫色,红色和紫色。
有红色的岛屿A和蓝色的岛屿B,他们之间有K座桥,答案将是这里写图片描述。所以,红色和蓝色之间的桥梁,答案应该是这里写图片描述
因此,最终的答案应该是ans1 * ans2 * ans3
你能计算出它O(n^2)强力(翻译666)。你也可以把它做成O(n)。

图析:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

细节:哇这个模数是个大质数!求逆元就直接a^(p-2);不要忘记还可以

代码:

#include <cstdio>#include <iostream>#define LL long long using namespace std;const int mod=998244353;LL mul[5005],inv[5005];LL ksm(LL a,LL k){    LL ans=1;    for (;k;k>>=1,a=a*a%mod)      if (k&1) ans=ans*a%mod;    return ans;}void init(){    mul[0]=mul[1]=1;inv[0]=inv[1]=1;    for (int i=2;i<=5000;i++)    {        mul[i]=mul[i-1]*i%mod;        inv[i]=ksm(mul[i],mod-2);    }}LL C(int n,int m){    if (m>n) return 0;    return mul[n]*inv[n-m]%mod*inv[m]%mod;}int main(){    int a,b,c,k;LL ans1=0,ans2=0,ans3=0;    scanf("%d%d%d",&a,&b,&c);    init();    for (k=0;k<=min(a,b);k++)      ans1=(ans1+C(a,k)*C(b,k)%mod*mul[k]%mod)%mod;    for (k=0;k<=min(b,c);k++)      ans2=(ans2+C(c,k)*C(b,k)%mod*mul[k]%mod)%mod;    for (k=0;k<=min(a,c);k++)      ans3=(ans3+C(a,k)*C(c,k)%mod*mul[k]%mod)%mod;    printf("%I64d",(LL)ans1*ans2%mod*ans3%mod);}
阅读全文
1 0
原创粉丝点击