7-1 Forever (20 分)

"Forever number" is a positive integer A with K digits, satisfying the following constrains:

  • the sum of all the digits of A is m;
  • the sum of all the digits of A+1 is n; and
  • the greatest common divisor of m and n is a prime number which is greater than 2.

Now you are supposed to find these forever numbers.

Input Specification

Each input file contains one test case. For each test case, the first line contains a positive integer N(≤5) N(≤5) . Then N lines follow, each gives a pair of K(3<K<10) K(3<K<10) and m(1<m<90) m(1<m<90) , of which the meanings are given in the problem description.

Output Specification

For each pair of K and m, first print in a line Case X, where X is the case index (starts from 1). Then print n and A in the following line. The numbers must be separated by a space. If the solution is not unique, output in the ascending order of n. If still not unique, output in the ascending order of A. If there is no solution, output No Solution.

Sample Input

2
6 45
7 80

Sample Output

Case 1
10 189999
10 279999
10 369999
10 459999
10 549999
10 639999
10 729999
10 819999
10 909999
Case 2
No Solution

【声明】

  由于此题还未上PAT官网题库,故没有测试集,仅仅是通过了样例,若发现错误,感谢留言指正。

Solution:

  这道题可以使用暴力,但一定要在过程中进行判断,从而减少循环次数。

  一般暴力的对手就是DFS了,所以这道题使用DFS比较简单

  不过重点就是要及时剪枝,不然和暴力没区别了

  具体的在代码的注释中有说明。

  【突然发现个规律,满足条件的永远是后k-2位都是9,0-1位是和为m- 9*(k-2) 的组合,若这个规律成立,那就简单多了^…^】

 #include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int nums, k, m, n;
vector<pair<int, int>>res;
int divisor(int a, int b)//求最大公约数
{
if (a%b == )
return b;
return divisor(b, a % b);
}
bool isPrime(int x)//判断是不是大于的素数
{
if (x <= )return false;
for (int i = ; i*i <= x; ++i)
if (x%i == )return false;
return true;
}
int getSum(int x)
{
int sum = ;
while (x)
{
sum += x % ;
x /= ;
}
return sum;
}
bool check(int a)
{
int b = a + ;
n = ;
while (b)
{
n += b % ;
b /= ;
}
if (isPrime(divisor(m, n)))
return true;
else
return false;
}
void DFS(string &str, int index, int digit, int sum)
{
if (index >= k || sum > m)return;//不能超过k位,从0开始
if (sum + * (k - index - ) < m)return;//第index数字太小,以至于其他位数全部填9其和都达不到m
str[index] = digit + '';//这步要写在前哦,因为sum已经加上了
if (sum == m && index == k - )//满足要求
{
int a = stoi(str.c_str());
if (check(a))
res.push_back(make_pair(n, a));
return;
}
for (int i = ; i < ; ++i)
DFS(str, index + , i, sum + i);
}
int main()
{
cin >> nums;
for (int i = ; i <= nums; ++i)
{
cin >> k >> m;
res.clear();
string str(k, '');
for (int j = ; j < ; ++j)
DFS(str, , j, j);//第一位不能为0
sort(res.begin(), res.end(), [](pair<int, int>v1, pair<int, int>v2) {//排序
if (v1.first == v2.first)
return v1.second < v2.second;
return v1.first < v2.first;
});
printf("Case %d\n", i);
if (res.size() > )
for (auto a : res)
cout << a.first << " " << a.second << endl;
else
printf("No Solution\n");
}
return ;
}

PAT甲级【2019年9月考题】——A1160 Forever【20】的更多相关文章

  1. PAT甲级【2019年3月考题】——A1157 Anniversary【25】

    Zhejiang University is about to celebrate her 122th anniversary in 2019. To prepare for the celebrat ...

  2. PAT甲级【2019年9月考题】——A1164 DijkstraSequence【30】

    7-4 Dijkstra Sequence (30 分) Dijkstra's algorithm is one of the very famous greedy algorithms. It is ...

  3. PAT甲级【2019年9月考题】——A1163 PostfixExpression【25】

    7-3 Postfix Expression (25 分) Given a syntax tree (binary), you are supposed to output the correspon ...

  4. PAT甲级【2019年9月考题】——A1162 MergingLinkedLists【25】

    7-2 Merging Linked Lists (25 分) Given two singly linked lists L 1 =a 1 →a 2 →...→a n−1 →a n  L1=a1→a ...

  5. PAT甲级【2019年3月考题】——A1159 Structure_of_a_BinaryTree【30】

    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...

  6. PAT甲级【2019年3月考题】——A1158 TelefraudDetection【25】

    Telefraud(电信诈骗) remains a common and persistent problem in our society. In some cases, unsuspecting ...

  7. PAT甲级【2019年3月考题】——A1156 SexyPrimes【20】

    Sexy primes are pairs of primes of the form (p, p+6), so-named since “sex” is the Latin word for “si ...

  8. PAT甲级2019冬季考试题解

    A Good In C纯模拟题,用string数组读入数据,注意单词数量的判断 #include<bits/stdc++.h> using namespace std; ; ][]; in ...

  9. 【PAT甲级】1116 Come on! Let's C (20分)

    题意: 输入一个正整数N(<=10000),接着依次输入N个学生的ID.输入一个正整数Q,接着询问Q次,每次输入一个学生的ID,如果这个学生的ID不出现在之前的排行榜上输出Are you kid ...

随机推荐

  1. java_第一年_JavaWeb(6)

    会话 会话:浏览器从打开一个进程访问服务器到该浏览器关闭,我们称之为一个会话: 在浏览器和服务器交互期间,会不可避免地产生一些数据,而为了为每个用户保存其对应的数据,可使用两种技术:Cookie和Se ...

  2. go 学习之io/ioutil包

    // Discard 是一个 io.Writer 接口,调用它的 Write 方法将不做任何事情// 并且始终成功返回.var Discard io.Writer = devNull(0) // Re ...

  3. meterpreter Command Sample

    meterpreter Command Sample ========================================================================= ...

  4. Java实现ArrayList

    说明都在注释: package adt.array; import java.util.Iterator; import java.util.NoSuchElementException; /** * ...

  5. 2018-8-10-win10-uwp-MetroLog-入门

    title author date CreateTime categories win10 uwp MetroLog 入门 lindexi 2018-08-10 19:16:53 +0800 2018 ...

  6. Shell 脚本举例

  7. linux的iptables设置---防火墙

    1.首先介绍一下指令和相关配置文件 启动指令:service iptables start 重启指令:service iptables restart 关闭指令:service iptables st ...

  8. Linux双网卡绑定bond详解

    参考资料: 1.https://blog.csdn.net/shengerjianku/article/details/79221886

  9. ini配置文件内如果有更新参数

    ini配置文件内如果有更新参数 执行更新 更新参数 自动去下载执行????

  10. python 利用subprocess调用cmd命令程序,并正确输出控制台的输出中文

    平台Python3.7 1.利用控制台运行程序后在控制台会输出中文提示,但是用python调用subprocess.run函数后返回的输出是乱码,于是,解决方法是用subprocess.check_o ...