Codechef September long challenge 2021 | Minimize Digit Sum Solution

 

Codechef September long challenge 2021 | Minimize Digit Sum Solution


  • Post comm

Let f(n,B)f(n,B) be the sum of digits of the integer nn when written in base BB.

Given QQ queries, each consisting of three integers n,ln,l and rr. Find the value of BB corresponding to which f(n,B)f(n,B) is minimum for all lBrl≤B≤r. If there are multiple such values, you can print any of them.

Input Format

  • The first line contains in single integer QQ, the number of queries
  • Each of the next Q lines contain three space separated integers n,ln,l and rr respectively.

Output Format

  • For each query (n l r), print the value of base BB which lies within [l,r][l,r] such that f(n,B)f(n,B) is minimum.

Constraints

  • 1Q1031≤Q≤103
  • 2n1092≤n≤109
  • 2lr1092≤l≤r≤109

Subtasks

Subtask #1 (50 points): original constraints

This problem is worth a total of 50 points and is meant to be complementary to the problem “MNDIGSM2” (also worth 50 points) which is very similar to this problem, but has slightly different constraints.

Sample Input 1 

3
216 2 7
256 2 4
31 3 5

Sample Output 1 

6
2
5

Explanation

Test case 11: We have f(216,2)=f(216,3)=4f(216,2)=f(216,3)=4f(216,4)=6f(216,4)=6f(216,5)=8f(216,5)=8f(216,6)=1f(216,6)=1 and finally f(216,7)=12f(216,7)=12. Clearly the minimum is obtained when B=6B=6.

Test case 22: Note that f(256,2)=f(256,4)f(256,2)=f(256,4) = 22, therefore both the answers 22 and 44 will be considered correct.

Test case 33: f(31,3)=f(31,5)=3f(31,3)=f(31,5)=3 and f(31,4)=7f(31,4)=7, therefore both the answers 33 and 55 will be considered correct.


C++ Solution

#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,l,r,ans;
cin>>n>>l>>r;
if(r>n){
ans=r;}
if(l<n && n<r){
ans=n;}
else{
int minval = INT_MAX;
for(int i=r;i>=l;i--)
{
int sum=0;
int ntemp=n;
while(ntemp>0)
{
sum+=ntemp%i;
ntemp/=i;
if(sum>minval)
break;
}
if(minval>sum)
{
minval=sum;
ans=i;
}
if(minval==1)
break;
}
cout<<ans<<"\n";
}
}
return 0;
}

 

Java Solution

/* package codechef; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Codechef
{
public static void main (String[] args) throws java.lang.Exception
{
Scanner scan = new Scanner(System.in);
int t = scan.nextInt();
while(t-- != 0) {
int n = scan.nextInt();
int l = scan.nextInt();
int r = scan.nextInt();
int ans = 0;
if(r > n) ans = r;
if(l < n && n < r) ans = n;
else{
int min = Integer.MAX_VALUE;
for(int i = r; i >= l; i--)
{
int sum = 0;
int ntemp = n;
while(ntemp > 0)
{
sum+=ntemp % i;
ntemp /= i;
if(sum > min)
break;
}
if(min > sum)
{
min = sum;
ans = i;
}
if(min == 1)
break;
}
System.out.println(ans);
}
}
}
}

 

Post a Comment

Previous Post Next Post