Codeforces Round #439 (Div. 2) C. The Intriguing Obsession

来源:互联网 发布:java开发重庆薪酬 编辑:程序博客网 时间:2024/05/20 10:15

                                                         B. The Eternal Immortality

本来打算给lzq助攻一波,结果忍不住交了一发,于是成功入坑。

A题题面有点繁琐,索性开这个题,发现貌似有规律。

题意:给你两个数a,b(b>=a).求b!/a!的最后一位。

因为是最后一位,普通求法只需将[a+1,b]的所有最后一位乘起来对10取余即可, 但发现只要a,b的距离超过10,必然会有0出现,最后一位肯定是0,那么这个套路就被识破啦。

#include<bits/stdc++.h>typedef long long ll;using  namespace std;int main(){   ll a,b;   cin>>a>>b;   if(b-a>=10) puts("0");   else   {       int sum=1;       for(ll i=a+1;i<=b;i++)       {           sum*=i%10;           sum%=10;       }       printf("%d\n",sum);   }   return 0;}

重点想写C题的,不过B题也是我很快写出来的,就一起写了吧,不过A题被我ssssb犯了个错误数组应该开3e6以上,开场半小时才想起这个坑,于是skiped第一发。

                                     

                                                C. The Intriguing Obsession

 题意:有三类群岛,分别有A、B、C个小岛,现在让你在这些小岛之间建桥,要求同类型小岛之间不能有桥,同类型小岛之间如果联通至少需要隔两个小岛。也就是说一个小岛不能和自己类型的小岛建边,也不能和两个同类型的小岛建边。求方案数。

组合数学一直是我们的弱项,实在写不出来就去睡了,今天补题发现思路很巧妙也不难。

因为小岛只能和其他类型的小岛建边,如果在最多的桥都能被建成的情况下,去掉某些桥,依然符合条件,A和B之间建桥不影响B和C的,其他同理。所以我们只需求出AB、BC、AC的建桥方案,然后相乘即可。那么怎么求两种类型的小岛的方案数呢?,还是用这个公式吧,很直观。

预处理打出组合数表即可,这里让我再次学了一波组合数: C(m,n)=C(m-1,n-1)+C(m-1,n)

const ll MOD=998244353;const int N=5e3+10;int a[5];ll C[N][N],p[N];void init(){    memset(C,0,sizeof(C));    p[0]=C[0][0]=1;    for(int i=1;i<N;i++)    {        p[i]=1ll*i*p[i-1]%MOD;        C[i][0]=1;        for(int j=1;j<=i;j++)            C[i][j]=(C[i-1][j-1]+C[i-1][j])%MOD;    }}ll solve(int a,int b){    ll sum=0,tmp;    for(int k=0;k<=a;k++)    {        tmp=p[k];        tmp=(tmp*C[a][k])%MOD;        tmp=(tmp*C[b][k])%MOD;        sum=(sum+tmp)%MOD;    }    return sum;}int main(){    init();   while(~scanf("%d%d%d",&a[0],&a[1],&a[2]))   {       sort(a,a+3);       printf("%I64d\n",((solve(a[0],a[1])*solve(a[1],a[2]))%MOD*solve(a[0],a[2]))%MOD);   }   return 0;}



C(m,n)=C(m-1,n-1)+C(m-1,n)
阅读全文
0 0