CF817C - Really Big Numbers (二分)

思路:如果一个数减去它的位数和小于等于x,那么所有小于这个数的数减去它本身的位数和都将小于等于x。可以证明当一个数满足了减去它的位数和小于等于x时,在个位数0~9的范围内,每减小1,位数和和它本身都减少1,所以0~9的范围内等价,当个位数从0减1变为9时,显然位数和增大了8,而此时数的本身仍然在减小,因此上述猜想成立。

因此,只要找到满足减去它的位数和小于等于x的最大的数m,则特殊数字的数量便为n-m+1

考虑到数据范围long long,二分找m值

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;

ll n,s;
int check(ll x)
{
    ll y=x;
    ll sum=0;
    while(y)
    {
        sum+=(y%10);
        y/=10; 
    }
    if(x-sum>=s)return 1;
    else return 0;
}
int main(){
    cin>>n>>s;
    ll l=1,r=n+1,mid;
    while(l<r)
    {
        mid=(l+r)/2;
        if(check(mid)==1)
        {
            r=mid;
        }
        else l=mid+1; 
    }
    cout<<n-r+1;
    return 0;
}

 

posted @ 2021-07-23 13:49  lemonGJacky  阅读(45)  评论(0)    收藏  举报