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;
}
posted @ 2023-07-01 10:51  liukejie  阅读(10)  评论(0)    收藏  举报