[CF]_[心得]_[869B]

本文分享了一位新手在CodeForces上解决特定数学问题的经验,即求解b!/a!的个位数。文章详细介绍了从初次尝试到最终成功通过的优化过程,包括对算法复杂度的改进及特殊情况的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为萌新,第一次在CF上的提交,经历了5次才通过。同时这种多次提交经历,说明在考虑问题是不够完备,如何在尽可能少的次数下AC(当然一次最棒)。

问题本身理解起来,或者说完全不需要理解,,,见下图

原题目

其实就是给定 a,b (a<=b), 求 b! / a! 的个位数字。

算法的关键是 a,b 的取值。

第一次,算法很直白,直接计算 b(b-1)(b-2)…a 每次累乘前后模10取个位,然而当 (b-a)过大时,累乘次数还是过多,会超时。

第二次,优化算法,经分析,当(b - a >= 100)时,最后答案一定是0.

{这时又忽然发现,不仅 >=100, 只要 >=10 都成立(这意味着还可以更快)}

之后两次出错是在(a==b)的特殊情况疏忽考虑。

下面是代码:

<>`include  <stdio.h>
int main(void)
{
    long long int a,b,ans,i,t;
    scanf("%lld %lld",&a,&b);
    ans = b % 10;
    t = b - a;
    if (t >= 100) ans = 0;   /*"if (t>=10)" is also ok.(no proving)*/  
    else
        if (a == b)  ans = 1;   
        else
            for(i = b - 1;i > a;i --)
                {
                    ans = ans * (i % 10);   
                    ans = ans % 10; 
                }
    printf("%lld",ans); 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值