CF - 817C. Really Big Numbers
这题是在1到n范围内找满足(设一个数为x,数位之和为sum(x))x-sum(x)>=s的数的个数,根据x满足条件,我们就可以得到x+1也满足条件,因为x+1-sum(x+1)=x+1-(sum(x)+1)=x-sum(x),由x-sum(x)>=s可得x+1-sum(x+1),所以x满足则x+1也满足,可以推广得到一个数满足则其后面的数都满足,因此要找1到n内总的满足条件的数,只需找到第一个满足条件的即可,然后看样例又可以知道数越大满足条件的可能性就越大,因此具有单调性,可以用二分找这个数,0视为不满足,1视为满足,可以看出是这样00001111。。。。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,s;
bool check(ll x)
{
ll tmp1=0;
ll tmp2=x;
while(x)
{
tmp1=tmp1+x%10;
x/=10;
}
if(tmp2-tmp1>=s)
return true;
else
return false;
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>s;
ll low=1,up=n,mid,ans=-1;
while(low<=up)
{
mid=(low+up)>>1;
if(check(mid))
{
ans=mid;
up=mid-1;
}
else
low=mid+1;
}
if(ans==-1)
cout<<0<<endl;
else
cout<<n-ans+1<<endl;
return 0;
}