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; }

浙公网安备 33010602011771号