Codeforces 899D Shovel Sale

题目大意

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

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

比赛时我的思路

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

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

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

\(k-1=0\),则为平凡情形。
考虑 \(k\ge 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()

posted @ 2017-12-17 22:17  Pat  阅读(193)  评论(0编辑  收藏  举报