废话
额,我们省的CSP-J/S因疫情不对初中生开放了。。。去洛谷自测了一下,J组成绩不错,S组稀烂
乘方(P8813)
错误做法:
c=pow(a,b);
if(c>pow(10,9))
…
这种方法中,c由于没有数据范围,所以可能爆long long,不可行
正解(应该很容易理解):
#include <iostream>
#include <cmath>//pow()
using namespace std;
int main()
{
unsigned long long a, b, c;//c会爆int,开long long
cin >> a >> b;
if(a == 1)//不写这个会TLE
{
cout << 1;//遇一直接输出
return 0;//直接结束程序
}
c = 1;//赋初值
for(int i = 0; i < b; i++)//手动乘方
{
c *= a;
if(c > pow(10, 9))// 爆
{
cout << -1;
return 0;//直接结束程序
}
}
cout << c;//输出
return 0;
}
解密(P8814)
由题意可推出
m
=
n
−
e
d
+
2
=
p
+
q
m = n - ed + 2 = p+q
m=n−ed+2=p+q(数据范围里有提示!!!)
利用完全平方公式
(
a
−
b
)
2
=
(
a
+
b
)
2
−
4
a
b
(a−b)^2=(a+b)^2−4ab
(a−b)2=(a+b)2−4ab 得
q
−
p
=
s
q
r
t
(
(
q
−
p
)
2
)
=
s
q
r
t
(
m
2
−
4
n
)
q-p=sqrt((q-p)^2)=sqrt(m^2-4n)
q−p=sqrt((q−p)2)=sqrt(m2−4n)
#include <iostream>
#include <cmath>//sqrt()
#define ull unsigned long long
using namespace std;
int main()
{
int k;
cin >> k;
for(int i = 0; i < k; i++)
{
ull n, e, d;
cin >> n >> e >> d;
ull m = n - e * d + 2;//p + q
ull p = (m + sqrt(m * m - 4 * n)) / 2;
/*因为sqrt(m * m - 4 * n) = q - p m = p + q
所以(m + sqrt(m * m - 4 * n)) = 2p */
ull q = m - p;//m - p = p + q - p = q
if (p * q == n) //满足条件
{
if(p > q) cout << q << ' ' << p;
else cout << p << ' ' << q;
}
else cout << "NO";
cout<< endl;
}
return 0;
}
完全平方公式这个方法我开始完全没想到,做完看了洛谷讨论区大佬的做法想出来的