前往题解部分的链接(我把题解做成了连续剧一样的东西)
上文链接
T1
快速幂,中间进行特判
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while (!isdigit(ch)){if (ch == '-') w = -1; ch = getchar();}
while (isdigit(ch)) s = (s << 1) + (s << 3) + (ch & 15), ch = getchar();
return s * w;
}
int a, b;
int power(int a, int b){
int res = 1;
while (b){
if (b & 1){
res *= a;
if (res > 1e9) return -1;
}
a *= a;
if (a > 1e9 && b != 1) return -1;
b >>= 1;
}
return res;
}
signed main(){
//freopen("pow.in", "r", stdin), freopen("pow.out", "w", stdout);
a = read(), b = read();
printf("%lld", power(a, b));
return 0;
}
T2
T3
T4
当时比赛的时候脑子嘎了,正解写到一半放弃了,最后爆零qwq……
比赛后写出了,开了O2过了qwq
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while (!isdigit(ch)){if (ch == '-') w = -1; ch = getchar();}
while (isdigit(ch)) s = (s << 1) + (s << 3) + (ch & 15), ch = getchar();
return s * w;
}
int n, k, x[501], y[501], dis[501][501], ans;
int dist(int i, int j){
return abs(x[i] - x[j]) + abs(y[i] - y[j]);
}
signed main(){
//freopen("point.in", "r", stdin), freopen("point.out", "w", stdout);
n = read(), k = read();
for (int i = 1; i <= n; i++) x[i] = read(), y[i] = read();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++){
if (i != j && x[i] <= x[j] && y[i] <= y[j]) dis[i][j] = dist(i, j) - 1;
else dis[i][j] = INT_MAX;
}
for (int l = 1; l <= n; l++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
dis[i][j] = min(dis[i][j], dis[i][l] + dis[l][j]);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (dis[i][j] <= k) ans = max(ans, dist(i, j) - dis[i][j] + k + 1);
printf("%lld", ans);
}
T1快速幂就多余了,除了1要特判,其他(如最小的2最多到32次就超过1e9了)根本不需要快速幂
反正过了就行了嘛~
az
%%%%%%%%%%%%%%%
# YYH AK CSP
%%%%%%%%%%%%%%%%%%%%%%%%%%
巨佬!YYH AK IOI!