Codeforces 1562B. B. Scenes From a Memory
原题链接
简单
作者:
蓬蒿人
,
2022-04-06 10:39:47
,
所有人可见
,
阅读 238
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
//1562B
// 题目大意
// T组读入 每组给你n和一个n位数 n<50
// 问怎么删使得最后的数是非质数(合数与1) 且数位最少
// 输出答案的位数 与答案
/*----------------------------解题思路----------------*/
// 首先 若数中有 1 4 6 8 9那么这些数就是答案 输出即可
// 同时 毛子证明了 只要是给出的输入 那么必然有位数<=2的答案
// 对于两位的情况 O(n^2)枚举凑两位数 再判断就行了
typedef long long LL;
int primes[1010],cnt;
int T,n,a[110];
bool st[1010];
void get_primes(int n){
for (int i=2;i<=n;i++){
if (!st[i]) primes[cnt++]=i;
for (int j=0;i<=n/primes[j];j++){
st[primes[j]*i]=1;
if (i%primes[j]==0) break;
}
}
}
bool check(int x){
for (int i=0;x>primes[i];i++){
if (x%primes[i]==0&&x/primes[i]>1){
return 1;
}
}
return 0;
}
int main(){
get_primes(1000);
bool ss[10]={0};
ss[1]=ss[4]=ss[6]=ss[8]=ss[9]=1;
scanf("%d", &T);
while (T--){
int p=0;
scanf("%d", &n);
for (int i=1;i<=n;i++){
scanf("%1d", &a[i]);
if (!p){
if (ss[a[i]]){
printf ("1\n%d\n",a[i]);
p=1;
}
}
}
if (!p){
for (int i=1;i<=n;i++){
for (int j=i+1;j<=n;j++){
int t=a[i]*10+a[j];
if (check(t)){
p=1;
printf ("2\n%d\n",t);
break;
}
}
if (p) break;
}
}
}
return 0;
}