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 ...
随机推荐
- ac自动机(tree+kmp模板)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- kvm扩容home目录
KVM虚拟磁盘扩容 1.磁盘扩容分为raw和qcow2两种扩容方式,命令相同,区别是后缀名 [root@daixuan ~]# qemu-img info /data/daixuan1.qcow2 / ...
- 11、numpy——字符串函数
NumPy 字符串函数 以下函数用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作. 它们基于 Python 内置库中的标准字符串函数. ...
- myeclipse 文件注释部分乱码问题
前几天安装了myeclipse,用了几天,写了一些Demo,并且都有注释,今天上午根据要求,重新配置了一下myeclipse,包括许多编码方式的改变,当时没在意,下午打开原来的Demo时,发现它们的注 ...
- SQL 日期格式化与格式转化
日期格式化 Select CONVERT(varchar(), GETDATE(), ): :57AM Select CONVERT(varchar(), GETDATE(), ): // Selec ...
- java Activiti6.0 后台 框架 spring5 SSM 工作流引擎 审批流程
1.模型管理 :web在线流程设计器.预览流程xml.导出xml.部署流程 2.流程管理 :导入导出流程资源文件.查看流程图.根据流程实例反射出流程模型.激活挂起 3.运行中流程:查看流程信息.当前任 ...
- elasticsearch 深入 —— 近似匹配
近似匹配 使用 TF/IDF 的标准全文检索将文档或者文档中的字段作一大袋的词语处理. match 查询可以告知我们这大袋子中是否包含查询的词条,但却无法告知词语之间的关系. 思考下面这几个句子的不同 ...
- printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - 输出格式转换
总览 (SYNOPSIS) #include <stdio.h> int printf(const char *format, ...); int fprintf(FILE *stream ...
- vue,一路走来(8)--mint-ui的组件问题
Mint-ui的复选框列表Checklist和Radio 由于我在main.js里已经引用了全部的组件了,这里就不再按需引入了. 一直想着如何将自己的数据添加到 label 和 value里面,后面发 ...
- HDU-4676 Sum Of Gcd 莫队+欧拉函数
题意:给定一个11~nn的全排列AA,若干个询问,每次询问给出一个区间[l,r][l,r],要求得出∑l≤i<j≤r gcd(Ai,Aj)的值. 解法:这题似乎做的人不是很多,蒟蒻当然不会做只 ...