1. 程式人生 > >2080 特殊的質數肋骨 USACO (深度優先搜尋)

2080 特殊的質數肋骨 USACO (深度優先搜尋)

農民約翰的母牛總是產生最好的肋骨。 你能通過農民約翰和美國農業部標記在每根肋骨上的數字認出它們。 農民約翰確定他賣給買方的是真正的質數肋骨,是因為從右邊開始切下肋骨,每次還剩下的肋骨上的數字都組成一個質數,舉例來說: 7 3 3 1 全部肋骨上的數字 7331是質數;三根肋骨 733是質數;二根肋骨 73 是質數;當然,最後一根肋骨 7 也是質數。 7331 被叫做長度 4 的特殊質數。 寫一個程式對給定的肋骨的數目 N(1<=N<=8),求出所有的特殊質數。 數字1不被看作一個質數。

 

思路:第一個數字肯定是2,3,5,7.  那麼後面的數字都是在1,3,7,9中尋找的,就是一個簡單的搜尋。那怎麼判斷是否為素數,我直接用了米勒拉賓判斷。

#include<cstdio>
#include<iostream>
typedef long long LL;
using namespace std;
int num[4] = { 1, 3, 7, 9 };
int n;


LL mulmod(LL a, LL b, LL p)

{

    LL  d = 1;

    a = a%p;

    while (b>0)

    {

        if (b & 1)

            d = (d*a) % p;

        a = (a*a) % p;

        b 
>>= 1; } return d; } bool witness(LL a, LL n) { LL d = n - 1; if (n == 2) return true; if (!(n & 1)) return false; while (!(d & 1)) d = d / 2; LL t = mulmod(a, d, n); while ((d != n - 1) && (t != 1) && (t != n - 1)) { t
= mulmod(t, 2, n); d = d << 1; } return (t == n - 1) || (d & 1); } bool isprime(LL n) { int a[3] = { 2, 7, 61 }; for (int i = 0; i<3; i++) if (!witness(a[i], n)) return false; return true; } void dfs(int x, int m) { if (x == n){ printf("%d\n", m); return; } for (int i = 0; i < 4; ++i) { if (isprime(m * 10 + num[i])){ dfs(x + 1, m * 10 + num[i]); } } } int main() { scanf("%d", &n); dfs(1, 2); dfs(1, 3); dfs(1, 5); dfs(1, 7); }