题意
给你一个整数 k k k,和 k k k位的十进制整数 n n n
问最多删除几位数字剩下的数字拼凑起来是合数(非素数),题目保证一定有解
输出保留的数的位数和该数
思路
首先考虑只保留一位数,即当该数存在合数位时直接输出即可
保留两位数时可以枚举所有数字,存在合数直接输出即可
可以知道最多保留三位数,在考虑保留三位数时该 10 10 10进制数所有位数都是质数,即 2 , 3 , 5 , 7 2,3,5,7 2,3,5,7中的一个
若存在两个相同的质数可以凑成 22 , 33 , 55 , 77 22,33,55,77 22,33,55,77必然不是素数,所以该数最多包含 2 , 3 , 5 , 7 2,3,5,7 2,3,5,7中的一个
又因为题目保证有解,四位数有解的情况三位数一定有解( 2 o r 5 2 or 5 2or5结尾都有解)
所以同样枚举即可
Code
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#pragma GCC optimize(3)
typedef long long ll;
#define INF 0x3f3f3f3f
const int mod = 1e9 + 7;
const int maxn = 1e5 + 5;
#define iss ios::sync_with_stdio(false)
#define debug(x) cout << #x << ": " << x << endl;
inline ll read() {
ll s = 0, w = 1;
char ch = getchar();
while (ch < 48 || ch > 57) {
if (ch == '-') w = -1;
ch = getchar();
}
while (ch >= 48 && ch <= 57)
s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * w;
}
bool vis[10];
bool chk(int x){
bool flag = false;
if(x < 10) return !vis[x];
for(int i = 2 ; i * i <= x ; ++i){
if(x % i == 0){
flag = true;break;
}
}
return flag;
}
void solove() {
int k = read();
string s;
cin >> s;
for (int i = 0; i < s.size(); ++i) {
if (chk(s[i] - '0')) {
puts("1");
cout << s[i] << endl;
return;
}
}
for (int i = 0; i < s.size(); ++i) {
for (int j = i + 1; j < s.size(); ++j) {
if (chk((s[i] - '0') * 10 + s[j] - '0')) {
cout << 2 << endl;
cout << s[i] << s[j] << endl;
return;
}
}
}
for (int i = 0; i < s.size(); ++i) {
for (int j = i + 1; j < s.size(); ++j) {
for (int k = j + 1; k < s.size(); ++i) {
int op = (s[i] - '0') * 100 + (s[j] - '0') * 10 + s[k] - '0';
if (chk(op)) {
cout << 3 << endl;
cout << s[i] << s[j] << s[k] << endl;
return ;
}
}
}
}
}
int main() {
vis[2] = vis[3] =vis[5]=vis[7]=true;
int t = read();
while (t--) {
solove();
}
}