CodeForces-Make It Round
题目


前言
我想了好久,太久没打cf了 变笨了。。。。
然后看了三集ok哥赶海。。。浪费时间了
思路
首先要分析到末尾有0 就是在问10这个因子有多少个
我真菜 连这个也没发现
于是可以发现 2*5 或者5 * 2
然后我们还要知道 就是你利用了多少个K 不是加啊
比如说你有2个5 不是说k用了10次 还是25次 因为这个k是针对原来的n
一旦我们 *5之后 补齐了一个10 还有一个5 再补齐的话 新的10也会再 * 5啊是不是?别的因子之前 *5了 再 *5 实际上你要耗费25个呢
我就是这点没认识到 误以为简单加和
比如 6 11
变成30 (2 * 5)
然后还剩6个,最大就一个0,然后值还要最大,你总不能跟我说这6个你直接乘上去吧
还明显不行 如果你此时要再扩大6倍 总耗费应该是6 *5
然后别的就没什么了 2 5 判断完了 就剩10了 剩下的没什么了
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int range=2e5+10;
int n;
int k;
void solve()
{
cin>>n>>k;
int x=n;
int ans1=0;
int ans2=0;
int ans3=0;
while(x%10==0)
{
ans1++;
x/=10;
}
while(x%2==0)
{
ans2++;
x/=2;
}
while(x%5==0)
{
ans3++;
x/=5;
}
int cost=1;
// cout<<ans2<<" "<<ans3<<endl;
while(ans3&&cost*2<=k){
cost*=2;
ans3--;
}
while(ans2&&cost*5<=k){
cost*=5;
ans2--;
}
int tot=k-cost;
// cout<<cost<<" "<<n*cost<<endl;
while((k-cost*10)>=0)
{
cost*=10;
}
// 25 5 5
//
for(int i=2;;i++)
{
if(i*cost>k)
{
// cout<<i*cost<<" "<<k<<" "<<cost<<endl;
cout<<n*(i-1)*cost<<endl;
return ;
}
}
}
signed main()
{
ios::sync_with_stdio();
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
//我好菜
//cin>>n>>k;
//int w=n;
//int ans1=0;
//int ans2=0;
//while(w%2==0)
//{
// w/=2;
// ans1++;
//}
//w=n;
//while(w%5==0)
//{
// w/=5;
// ans2++;
//}
//int num=0;
//w=n;
//cout<<ans1<<" "<<ans2<<endl;
//if(k-ans2*2>=0)
//{
// num+=ans2*2;
// k-=ans2*2;
// if(k-ans1*5>=0)
// {
// k-=ans1*5;
// num+=ans1*5;
// num+=(k/10);
// k=k-k/10;
// cout<<num*n<<endl;
// cout<<"ss"<<endl;
// }
// else{
// num+=k/5;
// k=k-k/5;
// cout<<n*num<<endl;
// cout<<"sss"<<endl;
// return ;
// }
//}
//else
//{
// cout<<(k/2)*n<<endl;
//}
//return ;
//// k-=ans2*2;
//// if(k-ans1*5<=0)
//// {
//// cout<<(k-k/5)*(n*(k/5+1))<<endl;
//// return ;
//// }
//// k-=ans2*5;
//// cout<<(k-k/10)*(n*(k/10+1))<<endl;

浙公网安备 33010602011771号