1. 程式人生 > 其它 >CF1433A Boring Apartments 題解

CF1433A Boring Apartments 題解

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;
}