CF817C Really Big Numbers 題解
阿新 • • 發佈:2022-01-17
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; }