3671産業スパイの手紙


質問する
こんにちは!私は産業スパイです.私の本当の身分を他の人に言わないでください.
私の最近の仕事は有名な数学研究所の最新の研究結果を盗むことです.私は有能な産業スパイなので、研究結果は難しくありません.しかし、研究所は私が来ることを事前に知っていたかもしれないし、研究結果をファイルカッターに入れた.仕方なく、涙を浮かべて紙切れを全部盗んで帰ってきた.
私を雇った人はとても恐ろしい人です.また、私はプロなので、間違いを許すことはありません.いずれにしても、私たちはこの紙を修復しなければなりません.この研究所の研究テーマは素数を急速に分解することである.私の紙切れには数字が1つしか書いていません.元の数字がわからない紙切れに書いてある数字を送りますが、紙切れが適当に少数に置かれている場合はいくつか教えていただけませんか.
ありがとうございます.
スパイの夢.
入力
第1行は、試験例の個数cを与える.(1≦c≦200)各試験箱は1行からなり、紙片に書かれた数字は空白ではない.紙切れの数は少なくとも1つ、最大7つです.
しゅつりょく
各試験箱について、紙片を適当に配置して作製できる数少ない異なる数の紙片を出力する.このとき、すべての紙切れを使わない.(7と1がある場合、作成できる数字は7、17、71)紙片を適当な位置に置いて作成した数字が0で始まると、前の0でクリアした数字は同じです.
に答える
「」から1ビット2ビット3からnビットまですべての組合せを求め,その値が素数であるか否かを判断する関数によりアルゴリズムとし,値が素数であればcountは+1とする.
import sys
sys.stdin = open('input.txt')
from itertools import permutations

def dfs():
    global count
    for i in range(1,len(nums)+1):              # 1자리부터 nums길이까지의 순열을
        combi = list(set(permutations(nums,i)))
        while combi:
            strnums = combi.pop()
            strnum = ''
            for s in strnums:
                strnum+=s
            if sosu(int(strnum)) and visited[int(strnum)]:
                count+=1
                visited[int(strnum)]= False

def sosu(num):
    if num <= 1:
        return False
    for i in range(2,int(num**0.5)+1):
        if num%i == 0:
            return False
    return True



c = int(input())
for _ in range(c):
    original=input()        # 1276543
    nums = list(original)   # [1,2,7,6,5,4,3]
    visited =[True]*(10**len(nums)) # 8자리 까지중 중복 제거
    count = 0               # 총 소수 갯수
    dfs()
    print(count)