解题思路:就二分就行了,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 人评分
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1144 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:567 |
1024题解浏览:806 |
简单的a+b (C语言代码)浏览:478 |
【偶数求和】 (C语言代码)浏览:430 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:509 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:546 |
WU-C语言程序设计教程(第三版)课后习题12.3 (C++代码)浏览:847 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:479 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:523 |
已退役 2023-08-18 19:49:09 |
log2(MAX_LONG_LONG)本身就是一个常数呀兄弟