CF1759D Make It Round
题意
给定一个商品的价格,再给一个价格提高到的倍数,求使得商品扩大到多少倍时使得商品价格最后的0最多,如果有多个价格0一样多,输出最大的那一个。如果不可能得到一个后缀0多的价格,输出扩大系数最多时的价格(n*m)。
思路
找后缀0,可以分析得出2*5是对后缀0有贡献的。所以先找出有多少个2,有多少个5,然后利用倍数补充没有配好对的2或者5,之后再把10的个数考虑进来,最后利用一个简单的除法即可找到最大的价格。
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=0x3f3f3f3f;
void solve()
{
ll n,m;
cin>>n>>m;
ll cnt2=0,cnt5=0;
ll tmp=n;
while (tmp%2==0)
{
cnt2++;
tmp>>=1;
}
while(tmp%5==0)
{
cnt5++;
tmp/=5;
}
ll res=1;
while(cnt5>cnt2&&m/2)
{
cnt5--;
n<<=1;
m>>=1;
}
while(cnt2>cnt5&&m/5)
{
cnt2--;
n*=5;
m/=5;
}
while(res*10<=m)
{
res*=10;
}
res=m/res*res;
cout<<res*n<<endl;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while (t--)
{
solve();
}
return 0;
}