Codeforces 899D Shovel Sale

题目大意

给定正整数 $n$($2le nle 10^9$)。
考虑无序整数对 $(x, y)$($1le x,yle n, x e y$)。
求满足 「$x+y$ 结尾连续的 9 最多」的数对 $(x,y)$ 的个数。

例子:
$n=50$,$(49,50)$ 是一个满足条件的数对。

比赛时我的思路

首先注意到,「两个正整数的和」的结尾的连续的 9 一定不包含进位的贡献,也不产生进位。

首先考虑(数对的和的)结尾最多有几个连续的 9 。不难得出:
设 $n$ 的位数为 $k$ ,令 $x=5 imes 10^{k-1}$ 。
若 $nge x$,则和的结尾最多有 $k$ 个连续的 9 。
若 $n=10^{k} - 1$,满足条件的数对有 $n - x$ 个,否则有 $n-x+1$ 个。

若 $n < x$ ,数对之和的第 $k$ 位一定小于 $9$,故结尾至多有 $k-1$ 个连续的 9 。

若 $k-1=0$,则为平凡情形。
考虑 $kge 2$ 的情形。
设 $n$ 的 第 $k$ 位上的数字为 $h(n)$,显然有 $h(n) > 0 $ 。

考虑数对 $(x,y)$($x>y$),设 $x$ 的第 $k$ 位上的数字为 $h(x)$ 。
将所有满足条件的数对 $(x,y)$ 分成下列若干类:

  1. $h(n)>h(x)=h(y)=0$
  2. $h(n)>h(x) = h(y) > 0$
  3. $h(n)>h(x) > h(y)>0$
  4. $h(n)>h(x) > h(y)=0$
  5. $h(n)=h(x) > h(y) > 0$
  6. $h(n) = h(x) > h(y) = 0$
  7. $h(n) = h(x)= h(y) $

在比赛中,我没考虑到上述第 7 种情况。

总结

本题的思维方式:分类。

实现技巧:
求一个正整数 $n$ 的位数可用 to_string(n).size()

原文地址:https://www.cnblogs.com/Patt/p/8053576.html