PAT甲级【2019年9月考题】——A1160 Forever【20】
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】的更多相关文章
- PAT甲级【2019年3月考题】——A1157 Anniversary【25】
Zhejiang University is about to celebrate her 122th anniversary in 2019. To prepare for the celebrat ...
- PAT甲级【2019年9月考题】——A1164 DijkstraSequence【30】
7-4 Dijkstra Sequence (30 分) Dijkstra's algorithm is one of the very famous greedy algorithms. It is ...
- PAT甲级【2019年9月考题】——A1163 PostfixExpression【25】
7-3 Postfix Expression (25 分) Given a syntax tree (binary), you are supposed to output the correspon ...
- 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 ...
- 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 ...
- PAT甲级【2019年3月考题】——A1158 TelefraudDetection【25】
Telefraud(电信诈骗) remains a common and persistent problem in our society. In some cases, unsuspecting ...
- 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 ...
- PAT甲级2019冬季考试题解
A Good In C纯模拟题,用string数组读入数据,注意单词数量的判断 #include<bits/stdc++.h> using namespace std; ; ][]; in ...
- 【PAT甲级】1116 Come on! Let's C (20分)
题意: 输入一个正整数N(<=10000),接着依次输入N个学生的ID.输入一个正整数Q,接着询问Q次,每次输入一个学生的ID,如果这个学生的ID不出现在之前的排行榜上输出Are you kid ...
随机推荐
- 3. ZooKeeper客户端(一)
ZooKeeper常用客户端有三种:原生客户端.zkClient.curator 项目中使用前,需要导入相关依赖 <dependencies> <dependency> < ...
- sublime text3 安装插件
遇到的问题1: 软件中无此属性 打开Packages目录,Preferences > Browse Packages 就可以进入这个目录.$ cd Packages/$ git clone ht ...
- vue,一路走来(6)--微信支付
微信支付 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6 分享一下vue实现微信支付.在微信浏览器里面 ...
- Cent OS 7 VNC 安装
关闭防火墙 关闭selinux 挂载光盘到本地 #yum install tigervnc-server -y #cp /lib/systemd/system/vncserver@.service / ...
- ltp-ddt realtime_cpuload_10p 涉及的cpuloadgen交叉编译及安装
1.下载源码 https://github.com/ptitiano/cpuloadgen/archive/v0.94.tar.gz 解压 tar -zxvf cpuloadgen-0.94.tar. ...
- github托管代码
安装git客户端 github是服务端,要想在自己电脑上使用git我们还需要一个git客户端, windows用户请下载 http://msysgit.github.com/ mac用户请下载 htt ...
- Spring MVC 跳转失败,但配置正确填坑
1:正确写法 @RequestMapping("{type_key}.html") public String geren(Model model, @PathVariable S ...
- plsql查询数据中文乱码
在plsql中进行表数据查询的时候,发现查询出来的中文居然显示为乱码,通过查找资料解决该问题. 1.查看数据的编码(语句:select * from v$nls_parameters) 发现显示的语言 ...
- phpstorm 开发php入门
环境:ubuntu phpstorm apache mysql 一.安装软件 安装apache服务器 https://i.cnblogs.com/EditPosts.aspx?postid=1113 ...
- golang-练习3
题目:将输入的字母变成其下一个字母,并且元音字母大写 package main import "fmt" func LetterChanges(str string) string ...