解题思路:就二分就行了,ans满足:ans/5+ans/25+ans/125+ans/625+...=k。这里的除的结果都是向下取整,求最小的满足这个等式的数即可。
注意事项:这一题不要开O2优化,因为它会把mid=l+(r-l)/2变成mid=(l+r)/2,造成越界变为负数
参考代码:
#include<bits/stdc++.h>//
using namespace std;
typedef long long ll;
ll k;
ll check(ll x){//返回x的阶乘中的末尾0的个数
ll ret=0;
while(x){
ret+=x/5;
x/=5;
}
return ret;
}
ll ErFen(ll l,ll r){
while(l<r){
ll mid=l+(r-l)/2;//l<=mid<r
if(check(mid)>=k){
r=mid;
}
else if(check(mid)<k){
l=mid+1;
}
}
}
int main(){
scanf("%lld",&k);
ll ans=ErFen(0LL,LONG_LONG_MAX);
if(check(ans)==k){
printf("%lld",ans);
}
else printf("-1");
return 0;
}
0.0分
6 人评分
不容易系列2 (C语言代码)浏览:597 |
【计算球体积】 (C语言代码)浏览:1106 |
字符逆序 (C语言代码)浏览:646 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:514 |
【偶数求和】 (C语言代码)浏览:431 |
DNA (C语言代码)浏览:750 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:616 |
C二级辅导-同因查找 (C语言代码)浏览:568 |
C二级辅导-阶乘数列 (C语言代码)浏览:522 |
The 3n + 1 problem (C语言代码)浏览:505 |
已退役 2023-08-18 19:49:09 |
log2(MAX_LONG_LONG)本身就是一个常数呀兄弟