CF1433A Boring Apartments 題解
阿新 • • 發佈:2021-12-16
CF1433A Boring Apartments 題解
對這個數取模得到其個位數,根據“無聊的數字”的定義可知它就是由這個個位數組成的。然後我們通過分離數位得到其位數,最後直接按照上面的公式計算即可。雖然效率會有些低,但是對於這道題目是足夠的了。
Content
我們把僅由一個或多個相同的數位組成的數字叫作“無聊的數字”。我們把 \(\leqslant 10000\) 的這種數字按照以下規則排列:
- 首先,將僅由 \(1\) 組成的 \(\leqslant 10000\) 的“無聊的數字”按照升序排列:\(1,11,111,1111,...\)。
- 再將僅由 \(2\) 組成的 \(\leqslant 10000\) 的“無聊的數字”按照升序排列:\(2,22,222,2222,...\)。
- 以此類推。
給出 \(t\) 次詢問,每次詢問給定一個無聊的數字 \(x\),請求出當數列排到 \(x\) 時,\(x\) 以及前面所有的“無聊的數字”的位數之和。
資料範圍:\(1\leqslant t\leqslant 36,1\leqslant x\leqslant 9999\) 。
Solution
雖然翻譯可能和原來題面有些許出入,但是不會影響做題的。
我們假設現在給出的 \(x\) 僅由數字 \(a\) 構成,那麼前面肯定 \(10(a-1)\) 次,這是由於你在前面的僅由 \(1,2,...,a-1\) 構成的“無聊的數字”中,每個數字按了 \(1+2+3+4=10\) 次,所以就是 \(a-1\) 次,然後,我們根據這個數的位數 \(y\),我們可以推出當前的數字一共按了 \(1+2+...+y=\dfrac{y(y+1)}{2}\) 次,所以一共按了 \(10(a-1)+\dfrac{y(y+1)}{2}\) 次。
官方題解是直接字串讀入然後提取構成的數字和數位的,下面給出一種不同於官方題解的具體實現:我們可以直接拿 \(10\)
Code
int t, x; int main() { //This program is written in Windows 10 by Eason_AC getint(t); while(t--) { getint(x); int p = x, digit = 0; while(p) { digit++; p /= 10; } printf("%d\n", (x % 10 - 1) * 10 + (digit + 1) * digit / 2); } return 0; }