817C. Really Big Numbers 二分

LINK

题意:给出两个数n, s,要求问1~n中(x-bit(x)>=s)的数有多少个。其中bit(x)指x的各位数之和

思路:首先观察能够发现,对于一个数如果满足了条件,由于x-bit(x)总是随x变大而变大的,所以只要求得最小的x能够满足条件,二分即可

/** @Date    : 2017-07-02 11:17:55
  * @FileName: 817C 二分.cpp
  * @Platform: Windows
  * @Author  : Lweleth (SoungEarlf@gmail.com)
  * @Link    : https://github.com/
  * @Version : $Id$
  */
#include <bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8;

LL n, s;

LL trans(LL x)
{
	LL res = 0;
	while(x)
	{
		res += x % 10;
		x /= 10;
	}
	return res;
}
int main()
{
	while(cin >> n >> s)
	{
		LL l = 1, r = 1e18 + 20;//注意范围
		if(s >= n)//注意s可能大于n
		{
			printf("0
");
			continue;
		}
		while(l < r)
		{
			LL mid = (l + r) >> 1;
			if(mid - trans(mid) >= s)
				r = mid;
			else l = mid + 1;

			//cout << l << '~' << r << endl;
			//cout << mid << "~" << trans(mid) << endl;
		}
		if(l > n)
			printf("0
");
		else
			printf("%lld
", n - l + 1);
	}
    return 0;
}
原文地址:https://www.cnblogs.com/Yumesenya/p/7115390.html