Codeforces Round #834 (Div. 3) D. Make It Round(贪心/数论)

https://codeforces.com/contest/1759/problem/D

题目大意:

给定一个数字n,要求扩大至多m倍,求最大的并且最多0的数字。
input 
10
6 11
5 43
13 5
4 16
10050 12345
2 6
4 30
25 10
2 81
1 7
output 
60
200
65
60
120600000
10
100
200
100
7

详解见代码内注释

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=1000200,M=4002;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    cin>>T;
    while(T--)
    {
        LL n,m;
        cin>>n>>m;
        LL two=0,five=0,ans=1;
        //计算n里面由多少个2和5组成
	LL x=n;
	while(x%2==0)
        {
            x/=2;
            two++;
        }
        x=n;
        while(x%5==0)
        {
            x/=5;
            five++;
        }
        //如果5的个数多的话,多出来的用倍数2去匹配
        //注意扩大倍数不能超过m
        while(five>two&&ans*2<=m)
        {
            five--;
            ans*=2;
        }
        //如果2的个数多的话,多出来的用倍数5去匹配
        //注意扩大倍数不能超过m
        while(five<two&&ans*5<=m)
        {
            two--;
            ans*=5;
        }
        //剩下都是10的,直接在不超过最大限制的范围内进行扩大
        while(ans*10<=m)
        {
            ans*=10;
        }
        //答案就是n*(m/ans*ans)为最大倍数且0最多
        cout<<n*(m/ans*ans)<<endl;
    }
    return 0;
}
 
posted @ 2023-01-14 17:26  Vijurria  阅读(19)  评论(0编辑  收藏  举报