暑期培训 Day 12 <做不完的题QWQ>

发布时间 2023-07-31 21:00:04作者: DW_4

今天来做做csp-j 2022的题!!!

怎么说呢,虽然说 csp-j 一般是初中生去考,但是对于我这种弱市弱校的超级蒟蒻,还是可以去看看的(because csp-s 的题的难度都是普及+和提高,太难了QWQ,呜呜)

- [1] [CSP-j 2022] 乘方

题目描述

小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 \(a\)\(b\),求 \(a^b\) 的值是多少。
\(a^b\)\(b\)\(a\) 相乘的值,例如 \(2^3\) 即为 \(3\)\(2\) 相乘,结果为 \(2 \times 2 \times 2 = 8\)
“简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误。
小文很快意识到,她的程序里的变量都是 int 类型的。在大多数机器上,int 类型能表示的最大数为 \(2^{31} - 1\),因此只要计算结果超过这个数,她的程序就会出现错误。
由于小文刚刚学会编程,她担心使用 int 计算会出现问题。因此她希望你在 \(a^b\) 的值超过 \({10}^9\) 时,输出一个 -1 进行警示,否则就输出正确的 \(a^b\) 的值。
然而小文还是不知道怎么实现这份程序,因此她想请你帮忙。

输入格式

输入共一行,两个正整数 \(a, b\)

输出格式

**输出共一行,如果 \(a^b\) 的值不超过 \({10}^9\),则输出 \(a^b\) 的值,否则输出 -1。

样例 #1

样例输入 #1

10 9

样例输出 #1

1000000000

样例 #2

样例输入 #2

23333 66666

样例输出 #2

-1

提示

对于 10 %的数据,保证 b = 1。
对于 30 % 的数据,保证 \(b \le 2\)
对于 60 % 的数据,保证 \(b \le 30\)\(a^b \le {10}^{18}\)
对于 100 % 的数据,保证 \(1 \le a, b \le {10}^9\)
\(\text{upd 2022.11.14}\):新增加一组 \(\text{Hack}\) 数据。

一看就知道是签到题QWQ,还是very简单的

我直接一手快速幂,然后听取wa声一片,我就晓得有个奇怪的bug点没有考虑到(我***)!!!

罢了罢了,看看题解吧。

然后想着想着发现其实暴力也可以,什么题解啊,没意思,我直接暴力,时间还比你快QWQ

代码实现:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a,b;
	long long res=1;
	scanf("%d%d",&a,&b);
	for(int i=1;i<=b;i++){
		res=res*a;
		if(res>1e9){
			printf("-1");
			return 0;	
		} 
	}
	printf("%lld",res);
	return 0;
}

- [2] [CSP-J 2022] 解密

题目描述

给定一个正整数 \(k\),有 \(k\) 次询问,每次给定三个正整数 \(n_i, e_i, d_i\),求两个正整数 \(p_i, q_i\),使 \(n_i = p_i \times q_i\)\(e_i \times d_i = (p_i - 1)(q_i - 1) + 1\)

输入格式

第一行一个正整数 \(k\),表示有 \(k\) 次询问。
接下来 \(k\) 行,第 \(i\) 行三个正整数 \(n_i, d_i, e_i\)

输出格式

输出 \(k\) 行,每行两个正整数 \(p_i, q_i\) 表示答案。
为使输出统一,你应当保证 \(p_i \leq q_i\)
如果无解,请输出 NO

样例 #1

样例输入 #1

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

样例输出 #1

2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88

【数据范围】
以下记 \(m = n - e \times d + 2\)
保证对于 \(100\%\) 的数据,\(1 \leq k \leq {10}^5\),对于任意的 \(1 \leq i \leq k\)\(1 \leq n_i \leq {10}^{18}\)\(1 \leq e_i \times d_i \leq {10}^{18}\)
\(1 \leq m \leq {10}^9\)

测试点编号 \(k \leq\) \(n \leq\) \(m \leq\) 特殊性质
\(1\) \(10^3\) \(10^3\) \(10^3\) 保证有解
\(2\) \(10^3\) \(10^3\) \(10^3\)
\(3\) \(10^3\) \(10^9\) \(6\times 10^4\) 保证有解
\(4\) \(10^3\) \(10^9\) \(6\times 10^4\)
\(5\) \(10^3\) \(10^9\) \(10^9\) 保证有解
\(6\) \(10^3\) \(10^9\) \(10^9\)
\(7\) \(10^5\) \(10^{18}\) \(10^9\) 保证若有解则 \(p=q\)
\(8\) \(10^5\) \(10^{18}\) \(10^9\) 保证有解
\(9\) \(10^5\) \(10^{18}\) \(10^9\)
\(10\) \(10^5\) \(10^{18}\) \(10^9\)

乍一看,p 从 1 开始遍历,q 从 n[i] 开始遍历就可以了,but,如果有 \(10^{18}\)\(10^9\) 这种变态数据,肯定会爆!!!(也就是超时);所以开始对方程进行化简:

那么:

然后就非常简单了撒QWQ,就是初中学的求根公式!!!

代码实现:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll k;
    scanf("%lld",&k);
    while (k--) {
        ll n,e,d;
        scanf("%lld%lld%lld",&n,&e,&d);
        ll bq = sqrt((n - e * d + 2) * (n - e * d + 2) - (n * 4));
        ll dq = n - e * d + 2;
        ll P = (bq + dq) / 2;
        ll Q = dq - P;
        if (P * Q == n && e * d == (P - 1) * (Q - 1) + 1 && P && Q) {
            printf("%lld %lld\n",min(P, Q),max(P, Q));
        }else printf("NO\n");
    }
    return 0;
}

至于剩下的 T3 与 T4,今天晚上还要改今天考试的题,是真的没时间写了,所以说这一天过的还是挺充实的,嘻嘻QWQ!!!

古德er拜————————————华丽的结束