解法
再帰Aで127なら127,172,217,271,712,721と127を並べ替えたもののうち素数であるものを集計し。
集計した結果を使って再帰Bで全探索。
計算時間2.87秒。
結構手が込んでる割に遅い。
複雑でダサいコードになった。
シンプルでわかりやすいのがかっこいいと思う。
#include <iostream>
#include<stdio.h>
#include<map>
using namespace std;
std::map<int,int> count;
bool is_prime(int n){
if(n==2)return true;
if((n<2) || (n%2==0))return false;
for(int i=3;i*i<=n;i+=2){
if(n%i==0)return false;
}
return true;
}
void saikiA(int num,int bit,int keta){
if(is_prime(num)){
count[bit]++;
}
if(keta==8)return;
for(int i=1;i<=9;i++){
int b=(1<<(i-1));
if((bit&b)>0)continue;
saikiA(num*10+i,bit+b,keta+1);
}
}
int saikiB(int bit,int nowBit,int keta,int d,int mult){
int re=0;
if(mult==0)return 0;
if(keta==9){
return mult*count[nowBit];
}
for(int i=1;i<=9;i++){
int b=1<<(i-1);
if((bit&b)==0){
re+= saikiB(bit+b,b,keta+1,i+1,mult*count[nowBit]);
break;
}
}
for(int i=d;i<=9;i++){
int b=1<<(i-1);
if((bit&b)==0){
re+=saikiB(bit+b,nowBit+b,keta+1,i+1,mult);
}
}
return re;
}
int main() {
// your code goes here
for(int i=0;i<512;i++)count[i]=0;
saikiA(0,0,0);
printf("%d",saikiB(1,1,1,1,1));
return 0;
}
最終更新:2015年01月06日 05:40