1 条题解
-
2
一个数学知识,阶乘 0 的个数取决于这个阶乘中质因子 5 的个数,因为 2*5 才是 10,而 2 的数量肯定比我多。
然后一个 x!,怎么快速求 5 的个数呢: ⌊n/5⌋ → 5的倍数的个数,每个贡献1个5 ⌊n/25⌋ → 25的倍数的个数,额外再贡献1个5 ⌊n/125⌋ → 125的倍数的个数,额外再贡献1个5 ... 总和 = ⌊n/5⌋ + ⌊n/25⌋ + ⌊n/125⌋ + ... 就是代码中 check 部分了
最后要注意,求的是最小的x,那么x一定是5的倍数,为什么自己想
#include <bits/stdc++.h> using namespace std; using ll= long long; ll k; ll check (ll x) { ll sum=0; while(x/5) { sum+=x/5; x/=5; } if (sum<k) return 2; return sum==k; } int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin>>k; ll l=k*3,r=k*5+1; while(l+1!=r) { ll mid=l+r>>1; if (check(mid)) l=mid; else r=mid; } if (check(l)==2) cout<<-1; else if (l%5==0) cout<<l; else { l-=l%5; cout<<l; } }
信息
- ID
- 115
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 58
- 已通过
- 26
- 上传者