本系列为CSP-J/S算法竞赛真题讲解,会按照年份分析每年的真题,并给出对应的答案。本文为2022年真题。 https://www.luogu.com.cn/problem/list?tag=343&page=1
小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数
和
,求
的值是多少。
即
个
相乘的值,例如
即为
个
相乘,结果为
。
“简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误。
小文很快意识到,她的程序里的变量都是 int
类型的。在大多数机器上,int
类型能表示的最大数为
,因此只要计算结果超过这个数,她的程序就会出现错误。
由于小文刚刚学会编程,她担心使用 int
计算会出现问题。因此她希望你在
的值超过
时,输出一个 -1
进行警示,否则就输出正确的
的值。
然而小文还是不知道怎么实现这份程序,因此她想请你帮忙。
从文件pow.in中读入数据。 输入共一行,两个正整数
。
输出到文件pow.out中。 输出共一行,如果
的值不超过
,则输出
的值,否则输出 -1
。
10 9
1000000000
23333 66666
-1
对于
的数据,保证
。 对于
的数据,保证
。 对于
的数据,保证
,
。 对于
的数据,保证
。
:新增加一组
数据。
解题流程 1.开a , b变量+输入 *特殊情况∶如果a等于1直接输出1 2.开变量n,每次循环里会增加—次a 3.for循环0~b-1次循环求幂 n求幂,每次乘a 判断最新的数字是否大于10^9 是:输出-1,结束运行 否:继续for循环 4.输出最终答案n 注意事项 1.两个变量记得开ll或者ull都行反正int过不了 2.场上freopen一的文件名别写错 3.想我这种手敲了10^9的数清楚几个0 4.n变量初始值为1
参考:https://www.luogu.com.cn/problem/P8813
//#include <bits/stdc++.h>
#include<cstdio>//必须包含cstdio头文件
#include<iostream>
using namespace std;
int main(){
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
long long a,b,n=1;
cin>>a>>b;
if(a ==1 ){
cout<<"1";
return 0;
}
else{
for(long long i=0;i<b;i++){
n*=a;
if(n > 1000000000){
cout <<"-1";
return 0;
}
}
}
cout<<n;
//fclose(stdin);
//fclose(stdout);
return 0;
}
给定一个正整数
,有
次询问,每次给定三个正整数
,求两个正整数
,使
、
。
从文件decode.in中读入数据。
第一行一个正整数
,表示有
次询问。
接下来
行,第
行三个正整数
。
输出到文件decode.out中。
输出
行,每行两个正整数
表示答案。
为使输出统一,你应当保证
。
如果无解,请输出 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
【样例 #2】
见附件中的 decode/decode2.in
与 decode/decode2.ans
。
【样例 #3】
见附件中的 decode/decode3.in
与 decode/decode3.ans
。
【样例 #4】
见附件中的 decode/decode4.in
与 decode/decode4.ans
。
【数据范围】
以下记
。
保证对于
的数据,
,对于任意的
,
,
,
。
测试点编号 | k ≤ k \leq k≤ | n ≤ n \leq n≤ | m ≤ m \leq m≤ | 特殊性质 |
---|---|---|---|---|
1 1 1 | 1 0 3 10^3 103 | 1 0 3 10^3 103 | 1 0 3 10^3 103 | 保证有解 |
2 2 2 | 1 0 3 10^3 103 | 1 0 3 10^3 103 | 1 0 3 10^3 103 | 无 |
3 3 3 | 1 0 3 10^3 103 | 1 0 9 10^9 109 | 6 × 1 0 4 6\times 10^4 6×104 | 保证有解 |
4 4 4 | 1 0 3 10^3 103 | 1 0 9 10^9 109 | 6 × 1 0 4 6\times 10^4 6×104 | 无 |
5 5 5 | 1 0 3 10^3 103 | 1 0 9 10^9 109 | 1 0 9 10^9 109 | 保证有解 |
6 6 6 | 1 0 3 10^3 103 | 1 0 9 10^9 109 | 1 0 9 10^9 109 | 无 |
7 7 7 | 1 0 5 10^5 105 | 1 0 18 10^{18} 1018 | 1 0 9 10^9 109 | 保证若有解则 p = q p=q p=q |
8 8 8 | 1 0 5 10^5 105 | 1 0 18 10^{18} 1018 | 1 0 9 10^9 109 | 保证有解 |
9 9 9 | 1 0 5 10^5 105 | 1 0 18 10^{18} 1018 | 1 0 9 10^9 109 | 无 |
10 10 10 | 1 0 5 10^5 105 | 1 0 18 10^{18} 1018 | 1 0 9 10^9 109 | 无 |
特殊性质
保证有解
无
保证有解
无
保证有解
无
保证若有解则
保证有解
无
无
https://www.luogu.com.cn/problem/P8814
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main(int argc, const char * argv[]) {
long long k;
scanf("%lld",&k);
while (k--) {
long long n,e,d;
scanf("%lld%lld%lld",&n,&e,&d);
long long PsubQ = sqrt((n - e * d + 2) * (n - e * d + 2) - (n * 4));
long long PaddQ = n - e * d + 2;
long long P = (PsubQ + PaddQ) / 2;
long long Q = PaddQ - 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;
}
https://cspoj.com/contest.php?cid=1002 Fus5yz4x3EcSJH1Z
注意事项
/* 假设输入样例数据存在文件test.in中,输出样例数据存在文件test.out中, 则在CSP、NOI等比赛的代码中,需添加freopen、fclose语句, 内容详见模板代码如下。 */
#include <bits/stdc++.h>
#include<cstdio>//必须包含cstdio头文件
#include<iostream>
using namespace std;
int main(){
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
cout<<"Hello NOI"<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
下面为函数的简介,详细可参见 http://www.cplusplus.com/reference/clibrary/cstdio/freopen.html 函数名:freopen 声明:FILE *freopen( const char *path, const char *mode, FILE *stream ); 所在文件: stdio.h 参数说明: path: 文件名,用于存储输入输出的自定义文件名。 mode: 文件打开的模式。和fopen中的模式(如r-只读, w-写)相同。 stream: 一个文件,通常使用标准流文件。 返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。(一般可以不使用它的返回值) 功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
freopen("7532.in", "r", stdin);
freopen("7532.out", "w", stdout);
//原来的代码保持不变
double a, b, r;
int k;
cin >> a >> b;
k = int(a/b);
r = a - b * k;
printf("%g", r);
//-------------
fclose(stdin);
fclose(stdout);
return 0;
}