文章目錄
- @[toc]
- 試題編號
- 試題名稱
- 時間限制
- 內存限制
- 題目背景
- 題目描述
- 輸入格式
- 輸出格式
- 樣例1輸入
- 樣例1輸出
- 樣例2輸入
- 樣例2輸出
- 樣例3輸入
- 樣例3輸出
- 樣例3解釋
- 子任務
- 提示
- `Python`實現
文章目錄
- @[toc]
- 試題編號
- 試題名稱
- 時間限制
- 內存限制
- 題目背景
- 題目描述
- 輸入格式
- 輸出格式
- 樣例1輸入
- 樣例1輸出
- 樣例2輸入
- 樣例2輸出
- 樣例3輸入
- 樣例3輸出
- 樣例3解釋
- 子任務
- 提示
- `Python`實現
試題編號
試題名稱
時間限制
內存限制
題目背景
- 某次測驗后,頓頓老師在黑板上留下了一串數字 23333 23333 23333便飄然而去,凝望著這個神秘數字,小 P P P同學不禁陷入了沉思
題目描述
- 已知某次測驗包含 n n n道單項選擇題,其中第 i i i題 ( 1 ≤ i ≤ n ) (1 \leq i \leq n) (1≤i≤n)有 a i a_{i} ai?個選項,正確選項為 b i b_{i} bi?,滿足 a i ≥ 2 a_{i} \geq 2 ai?≥2且 0 ≤ b i < a i 0 \leq b_{i} < a_{i} 0≤bi?<ai?
- 比如說, a i = 4 a_{i} = 4 ai?=4表示第 i i i題有 4 4 4個選項,此時正確選項 b i b_{i} bi?的取值一定是 0 0 0、 1 1 1、 2 2 2、 3 3 3其中之一
- 頓頓老師設計了如下方式對正確答案進行編碼,使得僅用一個整數 m m m便可表示 b 1 b_{1} b1?, b 2 b_{2} b2?, ? \cdots ?, b n b_{n} bn?
- 首先定義一個輔助數組 c i c_{i} ci?,表示數組 a i a_{i} ai?的前綴乘積,當 1 ≤ i ≤ n 1 \leq i \leq n 1≤i≤n時,滿足:
c i = a 1 × a 2 × ? × a i c_{i} = a_{1} \times a_{2} \times \cdots \times a_{i} ci?=a1?×a2?×?×ai?
- 特別地,定義 c 0 = 1 c_{0} = 1 c0?=1
- 于是 m m m便可按照如下公式算出
m = ∑ i = 1 n c i ? 1 × b i = c 0 × b 1 + c 1 × b 2 + ? + c n ? 1 × b n \begin{aligned} m &= \displaystyle\sum\limits_{i = 1}^{n}{c_{i - 1} \times b_{i}} \\ &= c_{0} \times b_{1} + c_{1} \times b_{2} + \cdots + c_{n - 1} \times b_{n} \end{aligned} m?=i=1∑n?ci?1?×bi?=c0?×b1?+c1?×b2?+?+cn?1?×bn??
- 易知, 0 ≤ m < c n 0 \leq m < c_{n} 0≤m<cn?,最小值和最大值分別當 b i b_{i} bi?全部為 0 0 0和 b i = a i ? 1 b_{i} = a_{i} - 1 bi?=ai??1時取得
- 試幫助小 P P P同學,把測驗的正確答案 b 1 b_{1} b1?, b 2 b_{2} b2?, ? \cdots ?, b n b_{n} bn?從頓頓老師留下的神秘整數 m m m中恢復出來
輸入格式
- 從標準輸入讀入數據
- 輸入共兩行
- 第一行包含用空格分隔的兩個整數 n n n和 m m m,分別表示題目數量和頓頓老師的神秘數字
- 第二行包含用空格分隔的 n n n個整數 a 1 a_{1} a1?, a 2 a_{2} a2?, ? \cdots ?, a n a_{n} an?,依次表示每道選擇題的選項數目
輸出格式
- 輸出到標準輸出
- 輸出僅一行,包含用空格分隔的 n n n個整數 b 1 b_{1} b1?, b 2 b_{2} b2?, ? \cdots ?, b n b_{n} bn?,依次表示每道選擇題的正確選項
樣例1輸入
15 32767
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
樣例1輸出
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
樣例2輸入
4 0
2 3 2 5
樣例2輸出
0 0 0 0
樣例3輸入
7 23333
3 5 20 10 4 3 10
樣例3輸出
2 2 15 7 3 1 0
樣例3解釋
i i i | 1 1 1 | 2 2 2 | 3 3 3 | 4 4 4 | 5 5 5 | 6 6 6 | 7 7 7 |
---|---|---|---|---|---|---|---|
a i a_{i} ai? | 3 3 3 | 5 5 5 | 20 20 20 | 10 10 10 | 4 4 4 | 3 3 3 | 10 10 10 |
b i b_{i} bi? | 2 2 2 | 2 2 2 | 15 15 15 | 7 7 7 | 3 3 3 | 1 1 1 | 0 0 0 |
c i ? 1 c_{i - 1} ci?1? | 1 1 1 | 3 3 3 | 15 15 15 | 300 300 300 | 3000 3000 3000 | 12000 12000 12000 | 36000 36000 36000 |
子任務
- 50 % 50\% 50%的測試數據滿足: a i a_{i} ai?全部等于 2 2 2,即每道題均只有兩個選項,此時 c i = 2 i c_{i} = 2^{i} ci?=2i
- 全部的測試數據滿足: 1 ≤ n ≤ 20 1 \leq n \leq 20 1≤n≤20, a i ≥ 2 a_{i} \geq 2 ai?≥2且 c n ≤ 1 0 9 c_{n} \leq 10^{9} cn?≤109(根據題目描述中的定義 c n c_{n} cn?表示全部 a i a_{i} ai?的乘積)
提示
- 對任意的 1 ≤ j ≤ n 1 \leq j \leq n 1≤j≤n,因為 c j + 1 c_{j + 1} cj+1?, c j + 2 c_{j + 2} cj+2?, ? \cdots ?均為 c j c_{j} cj?的倍數,所以 m m m除以 c j c_{j} cj?的余數具有如下性質:
m % c j = ∑ i = 1 j c i ? 1 × b i m \% c_{j} = \displaystyle\sum\limits_{i = 1}^{j}{c_{i - 1} \times b_{i}} m%cj?=i=1∑j?ci?1?×bi?
- 其中 % \% %表示取余運算,令 j j j取不同的值,則有如下等式:
m % c 1 = c 0 × b 1 m % c 2 = c 0 × b 1 + c 1 × b 2 m % c 2 = c 0 × b 1 + c 1 × b 2 + c 2 × b 3 \begin{aligned} m \% c_{1} &= c_{0} \times b_{1} \\ m \% c_{2} &= c_{0} \times b_{1} + c_{1} \times b_{2} \\ m \% c_{2} &= c_{0} \times b_{1} + c_{1} \times b_{2} + c_{2} \times b_{3} \end{aligned} m%c1?m%c2?m%c2??=c0?×b1?=c0?×b1?+c1?×b2?=c0?×b1?+c1?×b2?+c2?×b3??
Python
實現
n, m = map(int, input().split())
a = list(map(int, input().split()))b = []
c = 1for i in range(n):temp = cc *= a[i]b.append((m % c) // temp)print(*b)