1. 程式人生 > 其它 >CF817C Really Big Numbers 題解

CF817C Really Big Numbers 題解

CF817C Really Big Numbers 題解

洛咕連結

思路

很明顯,答案具有單調性,直接二分答案就行。

讓我覺得巧妙的是題解中的思路:

首先不難發現,\([1 , s]\) 內的所有數都一定不合法。

剩餘的數直接統計並不容易,需要一些特殊處理。

然後就是巧妙的地方:\([1 , 10^{18}]\) 中數位之和最大為 \(9 \times 18 = 162\).

也就是說,\([s + 162,n]\) 一定是合法的。

那麼剩下的就只有 \([s + 1,s + 161]\) 這一段了,顯然可以直接列舉處理。

然後就可以愉快地 AC 了 (**)

code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n,s;
bool check(ll x) {
	ll d = 0,y = x;
	while(y)d += y % 10,y /= 10;
	return x - d >= s;
}
int main() {
	scanf("%lld%lld",&n,&s);
	ll ans = 0;
	if(s + 162 <= n)ans += n - (s + 162) + 1;
	for(ll i = s + 1;i <= min(n , s + 161);++ i) {
		ans += check(i);
	}
	printf("%lld",ans);
	return 0;
}