题意:一种数的定义是:数本身与该数每一位和的差大于等于给定的S。现在给你n让你求不大于n的数中有多少个满足要求。
(n,s <=1e18)
思路:一开始想着是数位dp,但不知道怎么记录,,其实有一个单调性,如果x满足,那么x+1一定满足。
证明:
数学归纳法: 假设x是reall big,那么设x的各项和为sumd(x),由条件有x - sumd(x) ≥ s。
那么对于 x + 1 有sumd(x + 1) = sumd(x) + 1,由不等式性质 x + 1 - sumd(x + 1) = x + 1 - sumd(x) - 1 = x - sumd(x) ≥ s也成立!
这样就可以二分找小于等于n的最小的满足的即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll s;
bool judge(ll x)
{
ll tmp = x, sum = 0;
while(x)
{
sum += x%10;
x /= 10;
}
return (tmp-sum) >= s;
}
int main(void)
{
ll n;
while(cin >> n >> s)
{
ll l = 0, r = n, ans = n+1;
while(l <= r)
{
ll mid = (l+r)/2;
if(judge(mid)) ans = mid, r = mid-1;
else l = mid+1;
}
printf("%I64d\n", n-ans+1);
}
return 0;
}