做题笔记 -- 1759D Make It Round

题目

cfhttps://codeforces.com/problemset/problem/1759/D

洛谷https://www.luogu.com.cn/problem/CF1759D

题目大意

给两个数n,m,求0后缀最长的最大的n*x,x<=m。

如果所有n*x都没有0后缀,输出n*m。

思路

假设n*x为0后缀最长的某个组合,那么n*x*k的0后缀一定不小于n*x 。

任意的10有10=2*5,n*x的所有0后缀由n和x中的2、5组成。

贪心的另n*x的2、5组合最多即可。

首先求n中的2和5因子的个数,再将多出来的部分用x补全,如果m中还有余下的2、5组合(也就是10),再将其加入x。

最后补上k=m/x 。

答案为 n*x*k 。

代码

void solve(){
    int n,m;
    cin >> n >> m;
    int t = n;
    int n2 = 0, n5 = 0;
    while(t % 2 == 0) {
        t /= 2;
        n2++;
    }
    while(t % 5 == 0) {
        t /= 5;
        n5++;
    }

    ll d = 1;
    while(n2 < n5 && d * 2 <= m) d *= 2, n2 ++;
    while(n5 < n2 && d * 5 <= m) d *= 5, n5 ++;
    while(d * 10 <= m) d *= 10;
    int k = m / d;
    cout << n*k*d << endl;
}

反思

该题分两步:

1) 将n*x中的10因子最大化

2) 将n*x最大化

题目中0后缀即10因子的体现。

经验总结

对于题干中有出现数的因子的题目,先在因子层面考虑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值