2018 ICPC 沈阳网络赛预赛 Supreme Number(找规律)
Posted czsharecode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018 ICPC 沈阳网络赛预赛 Supreme Number(找规律)相关的知识,希望对你有一定的参考价值。
【传送门】https://nanti.jisuanke.com/t/31452
【题目大意】:给定一个数字(最大可达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 <queue> #include <cstdio> #include <string.h> #include <cstdlib> #include <iostream> #include <vector> #include <algorithm> 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 #"<<k++<<": "; 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<<a1[i]<<endl; break; } } } else if(len == 2){ int num = atoi(s.c_str()); int flag = 0; for(int i=8; i>=0; i--){ if(a2[i] <= num){ flag = 1; cout<<a2[i]<<endl; break; } } if(flag == 0){ cout<<7<<endl; } } else if(len == 3){ int num = atoi(s.c_str()); int flag = 0; for(int i=5; i>=0; i--){ if(a3[i] <= num){ flag = 1; cout<<a3[i]<<endl; break; } } if(flag == 0){ cout<<73<<endl; } } else if(len >= 4){ cout<<"317"<<endl; } } return 0; }
以上是关于2018 ICPC 沈阳网络赛预赛 Supreme Number(找规律)的主要内容,如果未能解决你的问题,请参考以下文章