这道题很搞心态,用了素数判断、最大公约数以及各数位求和(分别写为了3个函数)
但是对范围内的数字进行暴力遍历的话,最后两个测试点会超时
需要根据测试结果想到所有满足条件的数都是以99结尾,这样只遍历99结尾的数才不会超时
(其实不大好想到,要多试一些数据,还有题目的名字联想)
#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
bool is_prime(int x){
int k=(int)sqrt(x*1.0);
if(x<=2) return false;
for(int i=2;i<=k;i++){
if(x%i==0) return false;
}
return true;
}
int gcd(int a,int b){
if(a%b==0){
return b;
}else{
return gcd(b,a%b);
}
}
int sum_digits(int x){
if(x<10){
return x;
}else{
return x%10+sum_digits(x/10);
}
}
struct node{
int ans1,ans2;
};
bool cmp(const node a,const node b){
if(a.ans1==b.ans1){
return a.ans2<b.ans2;
}else{
return a.ans1<b.ans1;
}
}
int N;
int main(){
cin>>N;
for(int i=0;i<N;i++){
printf("Case %d\n",i+1);
int K,M;
bool flag=true;
vector<node> v;
scanf("%d %d",&K,&M);
int start=(int)pow(10,K-1);
int end=(int)pow(10,K);
for(int j=start+99;j<end;j+=100){
int m=sum_digits(j);
int n=sum_digits(j+1);
if(is_prime(gcd(m,n))&&m==M){
flag=false;
v.push_back(node{n,j});
}
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++){
printf("%d %d\n",v[i].ans1,v[i].ans2);
}
if(flag){
printf("No Solution\n");
}
}
return 0;
}