本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总
【题目来源】
【题目描述】
给定一个正整数 k k k,有 k k k 次询问,每次给定三个正整数 n i , e i , d i n_i,e_i,d_i ni,ei,di,求两个正整数 p i , q i p_i,q_i pi,qi,使 n i = p i × q i n_i=p_i\times q_i ni=pi×qi、 e i × d i = ( p i − 1 ) ( q i − 1 ) + 1 e_i\times d_i=(p_i−1)(q_i−1)+1 ei×di=(pi−1)(qi−1)+1。
【输入】
第一行一个正整数 k k k,表示有 k k k 次询问。
接下来 k k k 行,第 i i i 行三个正整数 n i , d i , e i n_i,d_i,e_i ni,di,ei。
【输出】
输出 k k k 行,每行两个正整数 p i , q i p_i,q_i pi,qi 表示答案。
为使输出统一,你应当保证 p i ≤ q i p_i≤q_i pi≤qi。
如果无解,请输出 NO
。
【输入样例】
10
770 77 5
633 1 211
545 1 499
683 3 227
858 3 257
723 37 13
572 26 11
867 17 17
829 3 263
528 4 109
【输出样例】
2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88
【解题思路】
【算法标签】
《洛谷 P8814 解密》 #CSP-J入门级# #2022# #O2优化#
【代码详解】
#include <bits/stdc++.h>
#include <cmath>
using namespace std;
long long root; // 存储平方根结果
// 检查delta是否是完全平方数且满足条件
bool canused(long long n, long long m) {
root = sqrt(n);
if (root * root != n) return false; // 不是完全平方数
long long temp = root + m;
if (temp % 2 == 1) return false; // 必须是偶数
return true;
}
int main() {
int k; // 测试用例数量
cin >> k;
for (int i = 1; i <= k; i++) {
long long n, d, e;
cin >> n >> d >> e;
// 计算中间变量b
long long b = 2 - e * d + n;
// 计算判别式delta
long long delta = b * b - (n * 4);
if (delta < 0) {
cout << "NO" << endl; // 无实数解
}
else if (!canused(delta, b)) {
cout << "NO" << endl; // 不满足条件
}
else if (delta == 0) {
// 唯一解情况
long long ans = b / 2;
cout << ans << " " << ans << endl;
}
else {
// 两个解情况
long long ans1 = (b + root) / 2;
long long ans2 = (b - root) / 2;
// 按升序输出
if (ans1 > ans2) {
cout << ans2 << " " << ans1 << endl;
} else {
cout << ans1 << " " << ans2 << endl;
}
}
}
return 0;
}
#include <bits/stdc++.h>
#include <cmath>
using namespace std;
typedef long long LL;
int k; //定义正整数k
LL n, d, e; //定义n、d、e
int main()
{
cin >> k; //输入k
while (k--) { //循环k次
cin >> n >> d >> e; //输入n、d、e
LL m = n-e*d+2; //根据数学推导,计算m
LL r = sqrt(m*m-4*n); //根据数学推导,计算m*m-4*n的平方根
if (r*r==m*m-4*n) { //因为p和q是正整数,所以这里判断是否为完全平方根
cout << (m-r)/2 << " " << (m+r)/2 << endl; //计算p和q
} else {
cout << "NO" << endl; //否则输出NO
}
}
return 0;
}
【运行结果】
10
770 77 5
2 385
633 1 211
NO
545 1 499
NO
683 3 227
NO
858 3 257
11 78
723 37 13
3 241
572 26 11
2 286
867 17 17
NO
829 3 263
NO
528 4 109
6 88