Digit Sum II(ABC044&ARC060)

Posted jadelemon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

  




以上是关于Digit Sum II(ABC044&ARC060)的主要内容,如果未能解决你的问题,请参考以下文章

Combination Sum II

赛时总结 ◇赛时·II◇ AtCoder ABC-100

Combination Sum & Combination Sum II & Combination Sum III

c_cpp int sum_to_digit(int a)

18 & 454. 4Sum I & II

HDU 5710 Digit-Sum (构造)