【每日一题】数码

数码

https://ac.nowcoder.com/acm/problem/13221

题解:
很容易知道,每个数x的贡献为r/x,而且,许多相邻的数贡献是一样的。
比如:r=88,当首位为1时,x的可能取值为 { {1} , { [10,19) } }这两个可行区间。
x=1, ans+=88;
x=10, ans+=(88/10 = 8);
x=11, ans+=(88/11 = 8);
我们发现,10和11的贡献是相同的,当我们枚举到10的时候,得到的答案是8,此时只要88/8=11,代表一直到枚举到11,答案都是8,所以我们就可以直接跳到12,以此类推。。。
答案就是两个区间相减[1,r]-[1,l-1]。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll cal(ll n, ll k) {
  ll ans = n / k;
  for (ll l = k * 10, r = min(l + 9, n); l <= n;
       l *= 10, r = min(r * 10 + 9, n)) {
    for (ll i = l; i <= r;) {
      ll now = n / i;
      ll add = min(n / now, r);
      ans += now * (add - i + 1);
      i = add + 1;
    }
  }
  return ans;
}

int main() {
  ll x, y;
  cin >> x >> y;
  for (ll i = 1; i <= 9; i++) cout << cal(y, i) - cal(x - 1, i) << '\n';
  return 0;
}
全部评论

相关推荐

在喝茶的牛油很喜欢吃卤蛋:今天oc了
点赞 评论 收藏
分享
Ncsbbss:又想干活又想要工资,怎么什么好事都让你占了
点赞 评论 收藏
分享
把实习生当正职使昨天第一天就加班,晚上连口饭都没吃上,以后日子咋过,我不想干了
码农索隆:实习不怕忙,就怕干的活重复且没难度,要干就干那种有深度有难度的任务,这样才能快速的提升
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务