【CodeForces训练记录】Codeforces Round 976 (Div. 2) and Divide By Zero 9.0
https://codeforces.com/contest/2020
赛后反思
没有捏,尽力了
A题
给定 \(n,k\) 每次都可以将 \(n\) 减去 \(k\) 的任意次方,想要次数最少,我们显然使用贪心,每次尽可能减去最大,但我们倒过来想,\(k^{x_1}+k^{x_2}+k^{x_3} \cdots = n\) 这东东不就是将 \(n\) 转成 \(k\) 进制吗,对 \(k\) 进制的每一位求个和,注意一下 \(k = 1\) 死循环特判即可
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n,k; cin>>n>>k;
if(k == 1){
cout<<n<<endl;
return;
}
int ans = 0;
while(n){
ans+=n%k;
n/=k;
}
cout<<ans<<endl;
}
signed main(){
int T; cin>>T; while(T--)
solve();
return 0;
}
B题
玄学做法???我们手玩样例发现跟质数好像有点关系??我们瞪眼观察样例注意到 \(ans-\sqrt{ans} = x\),所以我们直接大力循环判断即可,循环的开始条件为 \(n + \sqrt{n}\)
这题我也不是很大明白,但是奇怪的过了 pretest
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int x; cin>>x;
for(int i=(x+sqrt(x))-100;;i++){
if(i - (int)sqrt(i) == x){
cout<<i<<endl;
break;
}
}
}
signed main(){
int T; cin>>T; while(T--)
solve();
return 0;
}