1104 天长地久
分数 20
作者 陈越
单位 浙江大学
“天长地久数”是指一个 K 位正整数 A,其满足条件为:A 的各位数字之和为 m,A+1 的各位数字之和为 n,且 m 与 n 的最大公约数是一个大于 2 的素数。本题就请你找出这些天长地久数。
输入格式:
输入在第一行给出正整数 N(≤5),随后 N 行,每行给出一对 K(3<K<10)和 m(1<m<90),其含义如题面所述。
输出格式:
对每一对输入的 K 和 m,首先在一行中输出
Case X,其中X是输出的编号(从 1 开始);然后一行输出对应的 n 和 A,数字间以空格分隔。如果解不唯一,则每组解占一行,按 n 的递增序输出;若仍不唯一,则按 A 的递增序输出。若解不存在,则在一行中输出No Solution。输入样例:
2 6 45 7 80输出样例:
Case 1 10 189999 10 279999 10 369999 10 459999 10 549999 10 639999 10 729999 10 819999 10 909999 Case 2 No Solution
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
//判断为素数
bool is_prime(int n) {
if (n < 2) {
return false;
}
else if (n == 2) {
return true;
}
else if (n % 2 == 0) {
return false;
}
else {
for (int i = 3; i <= sqrt(n); i += 2) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
int fun(int t) {
string s = to_string(t);
int c = 0;
for (int i = 0; i < s.size(); i++) {
//加上直接转为数字
c += s[i] - '0';
}
return c;
}
//求公约数
int fun2(int a, int b) {
int c = a % b;
if (c == 0) {
return b;
}
else {
return fun2(b, c);
}
}
//判断最大公约数是否为>2的素数
bool fun1(int a, int b) {
int t = fun2(a, b);
if (t > 2 && is_prime(t)) {
return true;
}
else {
return false;
}
}
struct r {
long long p;
long long q;
};
bool compare(r& r1, r& r2) {
if (r1.p == r2.p) {
return r1.q < r2.q;
}
return r1.p < r2.p;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
cout << "Case " << i + 1 << endl;
int c = 0;
long long start = pow(10, a - 1);
long long end = pow(10, a);
long long j = start;
vector<r> arr;
//优化代码速度找尾数为9的
while (j % 100 != 99 && j < end) {
j++;
}
for (j; j < end; j+=100) {
//求取i的位数和
long long t1 = fun(j);
if (t1 == b) {
long long t2 = fun(j + 1);
//判断t1,t2最大公约数为>2的素数
if (fun1(t1, t2)) {
arr.push_back({ t2,j });
//cout << t2 <<" "<< j << endl;
c++;
}
}
}
sort(arr.begin(), arr.end(), compare);
if (c == 0) {
cout << "No Solution" << endl;
}
else {
for (int i = 0; i < arr.size(); i++) {
cout << arr[i].p << " " << arr[i].q << endl;
}
}
}
return 0;
}
1103 缘分数
分数 20
作者 陈越
单位 浙江大学
所谓缘分数是指这样一对正整数 a 和 b,其中 a 和它的小弟 a−1 的立方差正好是另一个整数 c 的平方,而 c 正好是 b 和它的小弟 b−1 的平方和。例如 83−73=169=132,而 13=32+22,于是 8 和 3 就是一对缘分数。
给定 a 所在的区间 [m,n],是否存在缘分数?
输入格式:
输入给出区间的两个端点 0<m<n≤25000,其间以空格分隔。
输出格式:
按照 a 从小到大的顺序,每行输出一对缘分数,数字间以空格分隔。如果无解,则输出
No Solution。输入样例 1:
8 200输出样例 1:
8 3 105 10输入样例 2:
9 100输出样例 2:
No Solution
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int f = 0;
for (int i = a; i <= b; i++) {
long long c = i * i * i - (i - 1) * (i - 1) * (i - 1);
int t = sqrt(c);
if (t * t == c) {
int p = t;
for (int j = 2; j <= sqrt(p)+1; j++) {
if (j * j + (j - 1) * (j - 1) == p) {
cout << i << " " << j << endl;
f++;
}
}
}
}
if (f == 0) {
cout << "No Solution" << endl;
}
return 0;
}
1102 教超冠军卷
分数 20
作者 陈越
单位 浙江大学
“教育超市”是拼题 A 系统的一个衍生产品,发布了各种试卷和练习供用户选购。在试卷列表中,系统不仅列出了每份试卷的单价,还显示了当前的购买人次。本题就请你根据这些信息找出教育超市所有试卷中的销量(即购买人次)冠军和销售额冠军。
输入格式:
输入首先在第一行中给出一个正整数 N(≤104),随后 N 行,每行给出一份卷子的独特 ID (由小写字母和数字组成的、长度不超过8位的字符串)、单价(为不超过 100 的正整数)和购买人次(为不超过 106 的非负整数)。
输出格式:
在第一行中输出销量冠军的 ID 及其销量,第二行中输出销售额冠军的 ID 及其销售额。同行输出间以一个空格分隔。题目保证冠军是唯一的,不存在并列。
输入样例:
4 zju007 39 10 pku2019 9 332 pat2018 95 79 qdu106 19 38输出样例:
pku2019 332 pat2018 7505
/* 1102 教超冠军卷 */
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct goods {
string id;
int price;
int count;
long long sum;
};
bool compare(goods& g1, goods& g2) {
return g1.count > g2.count;
}
bool compare1(goods& g1, goods& g2) {
return g1.sum > g2.sum;
}
int main() {
int n;
cin >> n;
vector<goods> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i].id >> arr[i].price >> arr[i].count;
arr[i].sum = arr[i].price * arr[i].count;
}
sort(arr.begin(), arr.end(), compare);
cout << arr[0].id <<" " << arr[0].count << endl;
sort(arr.begin(), arr.end(), compare1);
cout << arr[0].id <<" " << arr[0].sum;
return 0;
}
585

被折叠的 条评论
为什么被折叠?



