PRIMPERM - Prime Permutations
如果用暴力筛因子的方法,在 \(t < 10^4, n < 10^7\) 下肯定是要超时的,所以用了时间和空间都较优的埃氏筛法来预处理出 \(1 \sim 10^7\) 的质数。
对于每一个 \(n\),先提取出 \(n\) 的每一位,放到一个数组里。求出数组的全排列,(使用函数 next_permutation
,用法:next_permutaion(数组名+起始地址,数组名+末尾地址+1)
,注意使用之前要对数组进行升序排序),之后判断组成的数字是否为素数即可。
代码如下:
main()
{
init(MAXN); //筛素数
read(t);
for(; t; -- t)
{
read(n);
int cnt = 0, res = 0;
for(;n;)
{
a[++ cnt] = n % 10; //转换成序列
n /= 10;
}
sort(a + 1, a + cnt + 1); // 排序
do{
if(!a[1]) continue; // 全排列的第一个数字不能是 0
n = 0;
rep(i, 1, cnt) n = n * 10 + a[i]; // 将全排列转化成数字
res += !f[n];
}while(next_permutation(a + 1, a + cnt + 1));
write(res, '\n');
}
return 0;
}