【传送门】
【题目大意】:给定一个数字(最大可达10100),现在要求不超过它的最大超级质数。超级质数定义:对于一个数,把它看成数字序列 ,如果它的所有子序列形成的数都是质数,那么它就是超级质数。
比如说3137,它的子序列有3,1,7,31,33,37,313,317,137.....由于有一个子序列是33它不是质数,所有3137不是超级质数。
【题解】注意,子序列和子串是不同的,子序列包含子串。子序列只要求相对顺序不变,而子串不仅仅要求顺序不变而且要求连续。比赛的时候因为这个WA了好几次。
(1)首先我们很容易知道,某个数它是超级质数,那么它所有位必须都是质数,也就是说,每一位上的数字只可能是1,2,3,5,7
(2)除了最高位可以是1,2,3,5,7,其余低位只能是1,3,7。因为2,5作低位必然有子序列不是质数。
(3)除了1后面还可以接1之外,其余数字后面都不能再接这个数字。比如3后面不能再接3,否则33不是质数。
(4)找出位数K = 1,2,3的所有满足条件的数,发现K = 4时,找不到4位数的超级质数。由于子序列不能是超级质数,那么4位以上的数不可能是超级质数。
【AC代码】
#include#include #include #include #include #include #include using namespace std;int a1[5] ={ 1,2,3,5,7};int a2[9] = { 11,13,17,23,31,37,53,71,73};int a3[6] = { 113,131,137,173,311,317};int main(){ ios::sync_with_stdio(false); int t; cin>>t; string s; int k=1; while(t--) { cin>>s; cout<<"Case #"< <<": "; int len = s.size(); if(len == 1){ int num = atoi(s.c_str()); for(int i=4; i>=0; i--){ if(a1[i] <= num){ cout< < =0; i--){ if(a2[i] <= num){ flag = 1; cout< < =0; i--){ if(a3[i] <= num){ flag = 1; cout< < = 4){ cout<<"317"<