1. 程式人生 > >2018 ICPC 沈陽網絡賽預賽 Supreme Number(找規律)

2018 ICPC 沈陽網絡賽預賽 Supreme Number(找規律)

std str c_str 位數 clu lib 由於 for else

【傳送門】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(找規律)