D. Make It Round(math)

Problem - D - Codeforces

在Berlandia发生了通货膨胀,所以商店需要改变商品的价格。

商品n的当前价格已经给出。允许将该商品的价格提高k倍,1≤k≤m,k为整数。输出商品的最圆的可能的新价格。也就是在最后有最大数量的零的那个。

例如,数字481000比数字1000010更圆(481000的末尾有三个零,而1000010的末尾只有一个零)。

如果有几个可能的变体,输出新价格最大的那个。

如果不可能得到一个更圆的价格,则输出n⋅m(即可能的最大价格)。

输入
第一行包含一个整数t(1≤t≤104)--测试中测试用例的数量。

每个测试用例由一行组成。

这一行包含两个整数:n和m(1≤n,m≤109)。其中n是商品的旧价格,数字m意味着你可以增加价格n不超过m倍。

输出
对于每个测试案例,在单独的一行中输出形式为n⋅k(1≤k≤m,k-一个整数)的最圆整数。

如果有几个可能的变体,则输出新价格(值n⋅k)最大的那一个。

如果不可能得到一个更圆的价格,则输出n⋅m(即可能的最大价格)。

例子
输入复制
10
6 11
5 43
13 5
4 16
10050 12345
2 6
4 30
25 10
2 81
1 7
输出拷贝
60
200
65
60
120600000
10
100
200
100
7
备注
在第一种情况下n=6,m=11。我们不能得到一个末尾有两个零或更多的数字,因为我们需要将价格提高50倍,但50>m=11。10的最大价格倍数将是6⋅10=60。

在第二种情况下,n=5,m=43。100的最大价格倍数将是5⋅40=200。

在第三种情况下,n=13,m=5。所有可能的新价格都不会以0结尾,那么你应该输出n⋅m=65。

在第四种情况下,你应该将价格提高15倍。

在第五种情况下,将价格提高12000倍。

题解:

要找相乘最后最多的0并且最大,我么首先要知道2*5 = 10

至于其他的5*6  5*8 4*5虽然也是后面有0,但他们都可分解为2*5,其他的值(例如2*5*3)只会影响其大小,不会影响其0的数目

所以我们先找n中有几个2,几个5

假设n中有2个2,4个5,那我们应该找m是可以有2个5,如果满足,再找10的数目,知道找到不能找为止,当然,最后可能虽然不为10,但是为2~9也要乘上

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<queue>
using namespace std;
char a[105][105];
void solve()
{
	long long n,m;
	cin >>n >> m;
	int cnt2 = 0,cnt5 = 0;
	int k = n;
	while(k%2 == 0)
	{
		cnt2 ++;
		k = k/2;
	}
	//k = n;
	while(k%5 == 0)
	{
		cnt5 ++;
		k = k /5; 
	}
	long long ans = 1;
	while(cnt5 > cnt2&& m/2)
	{
		cnt5--;
		n*=2;
		m/=2;
	}
	while(cnt2 > cnt5&& m/5)
	{
		cnt2--;
		n *=5;
		m/=5;
	}
	while(ans*10 <= m)
	{
		ans = ans*10;
	}
	ans = m/ans*ans;
	cout<<ans*n<<"\n";
	
}
int main()
{
	int t = 1;
	cin >> t;
	while(t--)
	{
		solve();
	}
}
//1 4
//2 1
//2 4
//3 4


//1 2
//1 3
//2 3
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值