【CodeForces訓練記錄】Codeforces Round 976 (Div. 2) and Divide By Zero 9.0

MNNUACM_2024ZY發表於2024-09-30

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;
}

相關文章