Digit Sum II( ABC044&ARC060)

问题 G: Digit Sum II

时间限制: 1 Sec  内存限制: 128 MB
提交: 36  解决: 11
[提交][状态][讨论版][命题人:admin]

题目描述

For integers b(b≥2) and n(n≥1), let the function f(b,n) be defined as follows:
·f(b,n)=n, when n<b
·f(b,n)=f(b,floor(n⁄b))+(n mod b), when n≥b
Here, floor(n⁄b) denotes the largest integer not exceeding n⁄b, and n mod b denotes the remainder of n divided by b.
Less formally, f(b,n) is equal to the sum of the digits of n written in base b. For example, the following hold:
·f(10,87654)=8+7+6+5+4=30
·f(100,87654)=8+76+54=138
You are given integers n and s. Determine if there exists an integer b(b≥2) such that f(b,n)=s. If the answer is positive, also find the smallest such b.
Constraints
1≤n≤1011
1≤s≤1011
n,s are integers.

输入

The input is given from Standard Input in the following format:
n
s

输出

If there exists an integer b(b≥2) such that f(b,n)=s, print the smallest such b. If such b does not exist, print -1 instead.

样例输入

87654
30

样例输出

10

题意:已知 n,s ,n 转化成b 进制数,且各位数之和为s, 求这个最小的b ,若不存在,输出 -1

             

 

c++ code:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
ll sum(ll n,ll b)
{
	ll ans=0;
	while(n)
	{
		ans+=n%b;
		n/=b;
	}
	return ans;
}
int main()
{
	
	ll n,s;
	scanf("%lld%lld",&n,&s);
	if(n==s)
		printf("%lld\n",n+1);
	else
	{
		for(ll i=2;i<=sqrt(n)+1;i++)
		{
			ll b=i;
			if(sum(n,b)==s)
			{
				return 0*printf("%lld\n",b);
				return 0;
			}
		}
		if(n-s>1)
		{
			for(ll i=sqrt(n);i;i--)
			{
				ll b=(n-s)/i+1;
				if(sum(n,b)==s)
				{
					printf("%lld\n",b);
					return 0;
				}
			}
		}
		puts("-1");
	}
	return 0;
}

  




posted @ 2018-05-29 21:51  jadelemon  阅读(266)  评论(0编辑  收藏  举报