文章目录
-
- [[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));
}
}