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)\) 分成下列若干类:
- \(h(n)>h(x)=h(y)=0\)
- \(h(n)>h(x) = h(y) > 0\)
- \(h(n)>h(x) > h(y)>0\)
- \(h(n)>h(x) > h(y)=0\)
- \(h(n)=h(x) > h(y) > 0\)
- \(h(n) = h(x) > h(y) = 0\)
- $h(n) = h(x)= h(y) $
在比赛中,我没考虑到上述第 7 种情况。
总结
本题的思维方式:分类。
实现技巧:
求一个正整数 \(n\) 的位数可用 to_string(n).size()
。