CF1538F 题解

这道题巨佬们都是用数位 dp 来做的……

好的我们来考虑一下当一个数 + 1 +1 +1 时变化的位数。

  • 0 + 1 = 1 0+1=1 0+1=1,变化为 1 1 1
  • 9 + 1 = 10 9+1=10 9+1=10,变化为 2 2 2
  • 99 + 1 = 100 99+1=100 99+1=100,变化为 3 3 3

显然,进位后有多少 0 0 0,就会改变零的个数 + 1 +1 +1 个数位

显然,对于每两个正整数 n n n m m m,在 n n n 以内能被 m m m 整除的数的个数为 n m \displaystyle{\frac{n}{m}} mn

所以,我们只要暴力枚举从 1 0 0 10^0 100 1 0 9 10^9 109(以 k k k 表示),使用容斥原理计算 a a a b b b 的能被这个数整除的数的个数。

或者,就是 b k − a k \displaystyle{\frac{b}{k}-\frac{a}{k}} kbka

时间复杂度 O ( log ⁡ 10 n ) O(\log_{10} n) O(log10n),完全可以。

附上我的丑陋代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
    int t;
    cin >> t;
    while(t--){
        int a, b;
        cin >> a >> b;
        int ans = 0;
        ans += b / 1 - a / 1;
        ans += b / 10 - a / 10;
        ans += b / 100 - a / 100;
        ans += b / 1000 - a / 1000;
        ans += b / 10000 - a / 10000;
        ans += b / 100000 - a / 100000;
        ans += b / 1000000 - a / 1000000;
        ans += b / 10000000 - a / 10000000;
        ans += b / 100000000 - a / 100000000;
        ans += b / 1000000000 - a / 1000000000;
        cout << ans << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值