SGU154 (Factorial)[二分,思维]

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=154

一开始用Java打了个表尝试找规律,但找了半天都没有发现什么靠谱的规律。。
正确的思路是,可以看到结尾0是5乘2或4或6或8得到的,有一个5就有一个结尾0。所以二分一个n,判断n中5的因子个数即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll check(ll mid) {
ll cnt=0;
while(mid) {
cnt+=mid/5;
mid/=5;
}
return cnt;
}
int main() {
scanf("%lld",&n);
ll l=1,r=1000000000LL;
ll mid;
while(l<r) {
mid=(l+r)>>1;
if(check(mid)>=n) r=mid;
else l=mid+1;
}
if(check(l)==n)
printf("%lld",l);
else printf("No solution");
}