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

                                                          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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值