CSP-J 2022 T1乘方 T2解密

文章目录

    • [[CSP-J 2022] T1 - 乘方](#[CSP-J 2022] T1 - 乘方)
    • [[CSP-J 2022] T2 - 解密](#[CSP-J 2022] T2 - 解密)

[CSP-J 2022] T1 - 乘方

将 a a a乘 b b b次,如果这个结果大于 1 e 9 1e9 1e9就输出 − 1 -1 −1,否则输出其结果。

直接循环做乘法,当此时的结果大于 1 e 9 1e9 1e9时可以退出并输出 − 1 -1 −1。

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

int main(int argc, char const *argv[]) {
	long long a, b, ans = 1;
	cin >> a >> b;
	while (b--) {
		ans *= a;
		if (ans > 1e9) {
			cout << -1 << endl;
			return 0;
		}
	}
	cout << ans << endl;
}

主要是对这个程序复杂度的分析:

  • 当 a a a和 b b b都很大时, a n s ans ans很快就会 > 1 e 9 >1e9 >1e9并退出;
  • 当 a a a很大 b b b很小时,循环要么由于 b = 0 b=0 b=0结束,要么由于 a n s > 1 e 9 ans>1e9 ans>1e9而退出;
  • 当 a a a很小 b b b很大时,最坏的情况是 a = 1 a=1 a=1, b = 1 e 9 b=1e9 b=1e9,此时程序会执行 1 e 9 1e9 1e9次;若 a = 2 a=2 a=2,则程序只会执行 l o g 2 1 e 9 = 30 log_21e9=30 log21e9=30次,所以可以特判一下 a = 1 a=1 a=1的情况。

[CSP-J 2022] T2 - 解密

n i = p i q i n_i=p_iq_i ni=piqi, e i d i = ( p i − 1 ) ( q i − 1 ) + 1 e_id_i=(p_i-1)(q_i-1)+1 eidi=(pi−1)(qi−1)+1
e i d i = p i q i − p i − q i + 2 e_id_i=p_iq_i-p_i-q_i+2 eidi=piqi−pi−qi+2
e i d i = n i − p i − q i + 2 e_id_i=n_i-p_i-q_i+2 eidi=ni−pi−qi+2
p i + q i = n i − e i d i + 2 p_i+q_i=n_i-e_id_i+2 pi+qi=ni−eidi+2

所以有:
{ p i + q i = n i − e i d i + 2 p i q i = n \left\{ \begin{aligned} p_i+q_i&=n_i-e_id_i+2 \\ p_iq_i & = n \end{aligned} \right. {pi+qipiqi=ni−eidi+2=n

完全平方公式 ( a + b ) 2 = a 2 + 2 a b + b 2 (a+b)^2=a^2+2ab+b^2 (a+b)2=a2+2ab+b2, ( a − b ) 2 = a 2 − 2 a b + b 2 (a-b)^2=a^2-2ab+b^2 (a−b)2=a2−2ab+b2。
( a − b ) 2 = ( a + b ) 2 − 4 a b (a-b)^2=(a+b)^2-4ab (a−b)2=(a+b)2−4ab, a − b = ( a + b ) 2 − 4 a b a-b=\sqrt{(a+b)^2-4ab} a−b=(a+b)2−4ab 。

代入得 p i − q i = ( n i − e i d i + 2 ) 2 − 4 n p_i-q_i=\sqrt{(n_i-e_id_i+2)^2-4n} pi−qi=(ni−eidi+2)2−4n 。

与上式相加得 2 p i = n i − e i d i + 2 + ( n i − e i d i + 2 ) 2 − 4 n 2p_i=n_i-e_id_i+2+\sqrt{(n_i-e_id_i+2)^2-4n} 2pi=ni−eidi+2+(ni−eidi+2)2−4n , p i = n i − e i d i + 2 + ( n i − e i d i + 2 ) 2 − 4 n 2 p_i=\frac{n_i-e_id_i+2+\sqrt{(n_i-e_id_i+2)^2-4n}}{2} pi=2ni−eidi+2+(ni−eidi+2)2−4n 。

同理 q i = n i − e i d i + 2 − ( n i − e i d i + 2 ) 2 − 4 n 2 q_i=\frac{n_i-e_id_i+2-\sqrt{(n_i-e_id_i+2)^2-4n}}{2} qi=2ni−eidi+2−(ni−eidi+2)2−4n 。

由于最后的 p i p_i pi和 q i q_i qi要是正整数,所以需要判断一下 d e l t a delta delta。

cpp 复制代码
/*
* @Author: lyle
* @Date:   2024-09-29 14:44:58
* @Last Modified by:   lyle
* @Last Modified time: 2024-09-29 14:44:58
*/

#include <bits/stdc++.h>
#define ll long long

using namespace std;
int k; ll n, d, e;

int main(int argc, char const *argv[]) {
	cin >> k;
	while (k--) {
		cin >> n >> d >> e;
		ll x = n - e * d + 2;
		ll delta = x * x - 4 * n;
		if (delta < 0 or sqrt(delta) * sqrt(delta) != delta) {
			puts("NO");
			continue;
		}
		ll p = (x + sqrt(delta)) / 2;
		ll q = (x - sqrt(delta)) / 2;
		if (q <= 0) {
			puts("NO");
			continue;
		}
		if (p * q != n or e * d != (p - 1) * (q - 1) + 1) {
			puts("NO");
			continue;
		}
		printf("%lld %lld\n", min(p, q), max(p, q));
	}
}
相关推荐
深耕AI2 小时前
【MFC中OnInitDialog虚函数详解:哪个是虚函数?两个OnInitDialog的关系】
c++·mfc
CHANG_THE_WORLD2 小时前
并发编程指南 同步操作与强制排序
开发语言·c++·算法
pl00202 小时前
C++虚函数&虚析构函数&纯虚函数的使用说明和理解
c++·虚函数·纯虚函数·虚析构函数
gaoshou453 小时前
代码随想录训练营第三十一天|LeetCode56.合并区间、LeetCode738.单调递增的数字
数据结构·算法
自信的小螺丝钉3 小时前
Leetcode 240. 搜索二维矩阵 II 矩阵 / 二分
算法·leetcode·矩阵
KING BOB!!!4 小时前
Leetcode高频 SQL 50 题(基础版)题目记录
sql·mysql·算法·leetcode
小wanga5 小时前
C++知识
java·开发语言·c++
深思慎考5 小时前
LinuxC++项目开发日志——高并发内存池(1-定长内存池)
linux·c++
木心爱编程5 小时前
C++容器内存布局与性能优化指南
开发语言·c++·性能优化
我是渣哥5 小时前
Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
java·开发语言·jvm·后端·算法·职场和发展·性能优化