solution
- 测试点3超时:直接暴力搜超时。m和m+1的最大公约数一定是1,则A的个位一定是9才有可能gcd(m, m+1)大于1,步长变为10。
- 测试点1,3:m和n的最大公约数是大于2的素数
- 测试点2:按照n从小到大排序,若n相同则按照A从小到大排序
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int a, int b){
if(!b) return a;
return gcd(b, a % b);
}
int sum(int n){
int ans = 0;
while(n){
ans += n % 10;
n /= 10;
}
return ans;
}
bool isPrime(int n){
for(int i = 2; i * i <= n; i++){
if(n % i == 0) return false;
}
return true;
}
struct node{
int a, n;
friend bool operator < (node &n1, node &n2){
if(n1.n != n2.n) return n1.n < n2.n;
return n1.a < n2.a;
}
}nodes[1000000];
int main(){
int N, k, m, n, a, flag, tm, cnt;
scanf("%d", &N);
for(int i = 1; i <= N; i++){
cnt = flag = 0;
scanf("%d%d", &k, &m);
printf("Case %d\n", i);
a = pow(10, k - 1) + 9;
for(int j = a; j < a * 10; j += 10){
tm = sum(j);
n = sum(j + 1);
if(tm == m && gcd(tm, n) > 2 && isPrime(gcd(tm, n))){
nodes[cnt].a = j;
nodes[cnt++].n = n;
flag = 1;
}
}
sort(nodes, nodes + cnt);
for(int j = 0; j < cnt && flag; j++){
printf("%d %d\n", nodes[j].n, nodes[j].a);
}
if(!flag) printf("No Solution\n");
}
return 0;
}