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));
	}
}
相关推荐
2401_8414956427 分钟前
【计算机视觉】基于复杂环境下的车牌识别
人工智能·python·算法·计算机视觉·去噪·车牌识别·字符识别
Jonkin-Ma33 分钟前
每日算法(1)之单链表
算法
晚风残1 小时前
【C++ Primer】第六章:函数
开发语言·c++·算法·c++ primer
杨云强1 小时前
离散积分,相同表达式数组和公式
算法
地平线开发者1 小时前
征程 6 | BPU trace 简介与实操
算法·自动驾驶
满天星83035771 小时前
【C++】AVL树的模拟实现
开发语言·c++·算法·stl
Lris-KK2 小时前
力扣Hot100--94.二叉树的中序遍历、144.二叉树的前序遍历、145.二叉树的后序遍历
python·算法·leetcode
Mr_WangAndy2 小时前
C++设计模式_行为型模式_责任链模式Chain of Responsibility
c++·设计模式·责任链模式·行为型模式
麦麦鸡腿堡3 小时前
Java的动态绑定机制(重要)
java·开发语言·算法
时间之里3 小时前
【c++】:Lambda 表达式介绍和使用
开发语言·c++