這題我已經成功算出n=55555的答案了,但是太長沒辦法上傳。有沒有辦法可以縮短程式碼長度,或者不用離線算的想法呢?
看起來這題就算建n=1~55555的答案表,也很可能TLE,考驗大數的效率啊~
思考中...
應該存在某種數學解吧...
如果要建表 只要建 n = 55555
n = 1 就最後 1 個字
n = 2 就最後 2 個字
...
https://oeis.org/A151752 這裡有
即使如此,要求出 n = 55555的答案,也是要從 n =1、n =2......n=55554、n=55555這樣求,這樣的話就要做55555次的大數運算,而大數的位數最多可到55555,這樣子應該還是會TLE。如果直接把n=55555的答案貼上去,程式碼會過長,也不是辦法。
這題我已經成功算出n=55555的答案了,但是太長沒辦法上傳。有沒有辦法可以縮短程式碼長度,或者不用離線算的想法呢?
看起來這題就算建n=1~55555的答案表,也很可能TLE,考驗大數的效率啊~
思考中...
應該存在某種數學解吧...
如果要建表 只要建 n = 55555
n = 1 就最後 1 個字
n = 2 就最後 2 個字
...
https://oeis.org/A151752 這裡有
即使如此,要求出 n = 55555的答案,也是要從 n =1、n =2......n=55554、n=55555這樣求,這樣的話就要做55555次的大數運算,而大數的位數最多可到55555,這樣子應該還是會TLE。如果直接把n=55555的答案貼上去,程式碼會過長,也不是辦法。
程式碼可以有 10 MB
這題我已經成功算出n=55555的答案了,但是太長沒辦法上傳。有沒有辦法可以縮短程式碼長度,或者不用離線算的想法呢?
看起來這題就算建n=1~55555的答案表,也很可能TLE,考驗大數的效率啊~
思考中...
應該存在某種數學解吧...
如果要建表 只要建 n = 55555
n = 1 就最後 1 個字
n = 2 就最後 2 個字
...
https://oeis.org/A151752 這裡有
即使如此,要求出 n = 55555的答案,也是要從 n =1、n =2......n=55554、n=55555這樣求,這樣的話就要做55555次的大數運算,而大數的位數最多可到55555,這樣子應該還是會TLE。如果直接把n=55555的答案貼上去,程式碼會過長,也不是辦法。
程式碼可以有 10 MB
記錯了 抱歉
code 的長度限制是 10 k
n = 55555 長度是 54.2k
如果你能寫個 N 進位的 function
也是可以濃縮的。
顯然作弊比正規的解法還難。哈~~
這邊提供官方(?)解法。
這題的時間複雜度是 $\color{black}{O(n^2)}$,
但是 $\color{black}{n}$ 最大到 $\color{black}{55555}$,又有 $\color{black}{T\leq 555}$ 筆測資,
慘的是 $\color{black}{Tn^2>10^{12}}$,看起來怎麼樣都沒辦法在一秒內跑完對吧。
但其實不難發現對於每個 $\color{black}{n}$,這樣的 $\color{black}{n}$ 位數存在且唯一,
而且 $\color{black}{n=k}$ 的答案是 $\color{black}{n=k-1}$ 的答案加上最高一位。
所以只要算出 $\color{black}{n=55555}$ 的答案,就順便算出 $\color{black}{n=1, 2, \ldots, 55554}$ 的答案了。
設 $\color{black}{n=k}$ 的答案是 $\color{black}{a_k}$,則我們需要維護 $\color{black}{2^k}$ 和 $\color{black}{a_k/5^k}$。
注意 $\color{black}{a_k/5^k \leq 10^k/5^k = 2^k}$,
如果採用 $\color{black}{10^{18}}$ 進位,只需要 $930$ 個 64-bit integer 就能放得下,
而 $\color{black}{930\times 55555 < 10^8}$,好棒棒。
最後回應原 po。
你的 code 每次輸出一位數,會慢並不會很意外。
你可以先把 $\color{black}{n=55555}$ 的答案用字串存起來,
每次詢問時直接輸出這個字串的 $\color{black}{n}$-suffix。
code 的長度限制是 10 k
n = 55555 長度是 54.2k
如果你能寫個 N 進位的 function
也是可以濃縮的。
顯然作弊比正規的解法還難。哈~~
這邊提供官方(?)解法。
這題的時間複雜度是 $\color{black}{O(n^2)}$,
但是 $\color{black}{n}$ 最大到 $\color{black}{55555}$,又有 $\color{black}{T\leq 555}$ 筆測資,
慘的是 $\color{black}{Tn^2>10^{12}}$,看起來怎麼樣都沒辦法在一秒內跑完對吧。
但其實不難發現對於每個 $\color{black}{n}$,這樣的 $\color{black}{n}$ 位數存在且唯一,
而且 $\color{black}{n=k}$ 的答案是 $\color{black}{n=k-1}$ 的答案加上最高一位。
所以只要算出 $\color{black}{n=55555}$ 的答案,就順便算出 $\color{black}{n=1, 2, \ldots, 55554}$ 的答案了。
設 $\color{black}{n=k}$ 的答案是 $\color{black}{a_k}$,則我們需要維護 $\color{black}{2^k}$ 和 $\color{black}{a_k/5^k}$。
注意 $\color{black}{a_k/5^k \leq 10^k/5^k = 2^k}$,
如果採用 $\color{black}{10^{18}}$ 進位,只需要 $930$ 個 64-bit integer 就能放得下,
而 $\color{black}{930\times 55555 < 10^8}$,好棒棒。
最後回應原 po。
你的 code 每次輸出一位數,會慢並不會很意外。
你可以先把 $\color{black}{n=55555}$ 的答案用字串存起來,
每次詢問時直接輸出這個字串的 $\color{black}{n}$-suffix。
b=[]
b.append(5)
for i in range(1,55555):
c=0
for j in range(len(b)):
c+=b[j]*(10**j)
for s in range(1,10,2):
if(s*(10**i)+c)%(5**(i+1))==0:
b.append(s)
break
a=int(input())
for i in range(a):
d=int(input())
for j in range(d):
print(j)
TLE了......
code 的長度限制是 10 k
n = 55555 長度是 54.2k
如果你能寫個 N 進位的 function
也是可以濃縮的。
顯然作弊比正規的解法還難。哈~~
這邊提供官方(?)解法。
這題的時間複雜度是 $\color{black}{O(n^2)}$,
但是 $\color{black}{n}$ 最大到 $\color{black}{55555}$,又有 $\color{black}{T\leq 555}$ 筆測資,
慘的是 $\color{black}{Tn^2>10^{12}}$,看起來怎麼樣都沒辦法在一秒內跑完對吧。
但其實不難發現對於每個 $\color{black}{n}$,這樣的 $\color{black}{n}$ 位數存在且唯一,
而且 $\color{black}{n=k}$ 的答案是 $\color{black}{n=k-1}$ 的答案加上最高一位。
所以只要算出 $\color{black}{n=55555}$ 的答案,就順便算出 $\color{black}{n=1, 2, \ldots, 55554}$ 的答案了。
設 $\color{black}{n=k}$ 的答案是 $\color{black}{a_k}$,則我們需要維護 $\color{black}{2^k}$ 和 $\color{black}{a_k/5^k}$。
注意 $\color{black}{a_k/5^k \leq 10^k/5^k = 2^k}$,
如果採用 $\color{black}{10^{18}}$ 進位,只需要 $930$ 個 64-bit integer 就能放得下,
而 $\color{black}{930\times 55555 < 10^8}$,好棒棒。
最後回應原 po。
你的 code 每次輸出一位數,會慢並不會很意外。
你可以先把 $\color{black}{n=55555}$ 的答案用字串存起來,
每次詢問時直接輸出這個字串的 $\color{black}{n}$-suffix。
b=[]
b.append(5)
for i in range(1,55555):
c=0
for j in range(len(b)):
c+=b[j]*(10**j)
for s in range(1,10,2):
if(s*(10**i)+c)%(5**(i+1))==0:
b.append(s)
break
a=int(input())
for i in range(a):
d=int(input())
for j in range(d):
print(j)
TLE了......
已AC