---
tags: python,prime,質數
---
# ZJ d120. 10699 - Count the factors
[ZJ d120](https://zerojudge.tw/ShowProblem?problemid=d120)
nlist:標記0~n,是否為質數
plist:質數清單
## 思考流程圖
``` mermaid
graph TD;
建立0-n的質數表plist及nlist-->處理輸入值=nt=ni;
處理輸入值=nt=ni-->由nlist判斷-->nt非質數-->逐一plist因式分解ans+1-->輸出結果;
由nlist判斷-->nt為質數-->ans=1-->輸出結果;
輸出結果-->結束;
```
## 程式流程圖
```flow
st=>start: 開始
op=>operation: 建立0-n的質數表plist及nlist
input=>inputoutput: 處理輸入值=nt=ni
op2=>operation: 逐一p in plist因式分解
ans+1
result=>inputoutput: 輸出結果
cond=>condition: 由nlist判斷
nt是否質數?
cond2=>condition: 判斷nt=0?
e=>end: 結束
st->op->input->cond2
cond(yes)->result
cond(no)->op2->result
result(left)->input
cond2(yes,right)->e
cond2(no)->cond
```
## code
AC (0.8s, 14.9MB)
```python=
#線性篩法質數建表
n=1000000
nlist = [0,0,1]
for i in range(n//2):
nlist += [1,0]
plist = [2]
for i in range(3,n,2):
if nlist[i]:
plist.append(i)
for pi in plist:
if pi*i>n: break
nlist[pi*i] = 0
if i % pi ==0: break
while True:
try:
ni = nt = int(input())
if nt == 0: break
if nlist[nt]: #先判斷是否為質數,可加快0.2 S
ans = 1
else:
ans = 0
for p in plist:
if nt % p == 0:
ans += 1
while nt % p == 0: #質因數分解,可加快0.2 S
nt //= p
if nt == 1:break
print('{} : {}'.format(ni,ans))
except EOFError:
break
```
###### tags: `質數` `python` `prime`