首页 > 其他分享 >SP8591 PRIMPERM - Prime Permutations 题解

SP8591 PRIMPERM - Prime Permutations 题解

时间:2023-08-17 23:12:01浏览次数:42  
标签:Prime 10 int 题解 质数 tot SP8591 isprime 欧拉

题目链接

题目大意

给出 \(1\) 个数 \(n\),求 \(n\) 的各位拆分后重新排列组合得到新数是质数的个数。

思路(欧拉筛,全排列)

对于求质数,与其每组数据运行 \(1\) 次质数筛,不如在一开始就筛出 \([1,10^7]\) 内的所有质数,用 bool 数组统计起来,这样只需运行 \(1\) 次质数筛,大大节约了时间。

对于筛法,这里使用时间复杂度为 \(O(n)\) 的线性筛(欧拉筛),模板如下:

inline void ola(int n){//欧拉筛 
	isprime[1]=false;//1不是质数 
    for(int i=2;i<=n;i++) isprime[i]=true;//默认都是质数 
    for(int i=2;i<=n;i++){//从2开始筛 
        if(isprime[i]) p[++t]=i;//是质数 
        for(int j=1;j<=t&&i*p[j]<=n;j++){
            isprime[p[j]*i]=false;//如果这个数是质数,那么它的倍数肯定不是质数 
            if(i%p[j]==0) break;
        }
    }
}

接下来,我们可以分解 \(n\) 的每一位,用数组存起来,使用 next_permutation 进行全排列,最后得出新数判断即可,时间复杂度 \(O(t (\log_{10} n)!)\)。

注意:

  1. 有多组数据。

  2. 排列组成的第一个数不能为 \(0\)。

参考代码(请勿抄袭):

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e7+10;
bool isprime[MAXN];
int p[MAXN],t,n,s[10];
inline void ola(int n){//欧拉筛 
	isprime[1]=false;//1不是质数 
    for(int i=2;i<=n;i++) isprime[i]=true;//默认都是质数 
    for(int i=2;i<=n;i++){//从2开始筛 
        if(isprime[i]) p[++t]=i;//是质数 
        for(int j=1;j<=t&&i*p[j]<=n;j++){
            isprime[p[j]*i]=false;//如果这个数是质数,那么它的倍数肯定不是质数 
            if(i%p[j]==0) break;
        }
    }
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	ola(10000000);//筛出质数 
	cin>>t;
	while(t--){
		cin>>n;
		int tot=0,ans=0;
		while(n){//分解各位 
			s[++tot]=n%10;
			n/=10;
		}
		sort(s+1,s+tot+1);//从小到大排 
		do{
			if(!s[1]) continue;//排列组成的第一个数不能为0
			int QwQ=0;
			for(int i=1;i<=tot;i++){
				QwQ*=10;
				QwQ+=s[i];//得出新数 
			}
			if(isprime[QwQ]) ans++;//如果是质数,答案加1 
		}while(next_permutation(s+1,s+tot+1));
		cout<<ans<<endl;
	}
	return 0;
}

标签:Prime,10,int,题解,质数,tot,SP8591,isprime,欧拉
From: https://www.cnblogs.com/CodeFishHp/p/17639154.html

相关文章

  • P9518 queue 题解
    题目传送门思路一道稍稍有点复杂的模拟好题。本题的关键性就在于需要实现的leave函数必须支持任意位置的删除,任意元素的查询,这对于queue或是deque是十分不利的。故本题使用另外一种STL:list实现。但是,list的查询其实也是比较耗费时间的,那么我们可以使用\(Map\)来......
  • AT_abc182_e [ABC182E] Akari题解
    题目链接思路说实话,这道题其实算模拟,还是挺简单的那种。我们可以定一个int类型的二维数组,表示网格。通过不同的数字来表示该方格内不同的类型。然后,使用枚举法模拟网格内灯泡从上、下、左、右四个方向模拟光线的运动过程,在过程中增加可被照射到的格子数量,最后输出即可。坑点......
  • SP1837 PIE - Pie 题解
    题目链接思路一道简单二分答案题。对于每个确定的派的体积,设置左边界\(l\)、右边界\(r\)和尝试值\(mid\),用\(\operatorname{check}\)函数返回在每份有\(mid\)那么多派的情况下,可以分成几份。将这些结果加起来,与应分人数进行比较,如果份数小于人数,证明每一份分的太多了,将......
  • CF1762D GCD Queries 题解
    题面给定一个长度为\(n\)的排列\(0,1,\cdots,n-1\)。可以进行最多\(2n\)次询问,每次询问给出两个下标\(i,j\),交互器会返回\(\gcd(p_i,p_j)\)。询问以后,需要输出两个下标\(x,y\),满足\(p_x=0\lorp_y=0\)。特别地,\(\gcd(0,x)=x\)。题解观察次数限制,我们......
  • 题解 石头剪刀布
    plaesekillme.&&don'tforgetme.题目描述给定\(n\)个字符串\(s_i\)只包含0,1,2,现在要捏一个序列\(A\),\(s_i\)表示\(a_i\)可以捏成什么。1,2,3形成环形吊打关系,\(\omega(X)\)表示序列\(X\)最长的吊打子序列,吊打序列指的是对于\(a_{p_1},\dots,a_{p_k}\),除了......
  • CF1787E The Harmonization of XOR 题解
    CF1787ETheHarmonizationofXOR题目大意给定\(n\)个数\([1,2,3,\cdots,n]\)和两个正整数\(k\)和\(x\)。将这些数分成恰好\(k\)组使得每组的异或和都是\(x\)。(\(1\lek\len\le2\cdot10^5,1\lex\le10^9\))。题解首先,我们知道,如果我们无法从\(n\)......
  • CF1787E The Harmonization of XOR 题解
    题面将集合\(\left\{1,2,\cdots,n\right\}\)划分为\(k\)个非空不交子集,使得每个子集的异或和均为\(x\)。(\(1\len,k\le2\times10^5\))。题解首先显而易见的判断一下无解的情况,记\(sum=\bigoplus\limits_{i=1}^{n}i\),如果\(k\)为奇数但\(sum\neqx\)或......
  • CF803C Maximal GCD 题解
    题意构造一个长度为\(k\),和为\(n\)的严格单调递增序列,并最大化其最大公约数。(\(1\len,k\le10^{10}\))题解首先可以发现一个事实,这个序列的最大公约数一定为\(n\)的因子。所以我们可以考虑枚举\(n\)的所有因子并判断其能否成为整个序列的最大公约数。假设我们现在枚......
  • 【题解】#373. 「USACO1.1」Friday the Thirteenth 题解(2023-07-19更新)
    #373.「USACO1.1」FridaytheThirteenth题解本文章的访问次数为次。Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)Part2背景这个蒟蒻又一次写了一篇大水题的题解(话说为什么是又),当然也是为了纪念他的\(......
  • 【题解】#68. 「NOIP2004」津津的储蓄计划 题解(2023-07-19更新)
    #68.「NOIP2004」津津的储蓄计划题解本文章的访问次数为次。Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)Part2背景这是这个蒟蒻的第一篇题解,也是这个蒟蒻对自己的\(50\)AC的纪念。Part3更新日志......