N - Trailing Zeroes (III) LightOJ - 1138
N - Trailing Zeroes (III)
二分+找5的个数。找5的个数用了一个很巧妙的方法,先找5的倍数的数,再找25倍数的数,直到0。
二分写的好烂,交了好几遍
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <map> 5 #include <set> 6 #include <algorithm> 7 #include <fstream> 8 #include <cstdio> 9 #include <cmath> 10 #include <stack> 11 #include <queue> 12 using namespace std; 13 const double Pi=3.14159265358979323846; 14 typedef long long ll; 15 const int MAXN=5000+5; 16 const int dx[5]={0,0,0,1,-1}; 17 const int dy[5]={1,-1,0,0,0}; 18 const int INF = 0x3f3f3f3f; 19 const int NINF = 0xc0c0c0c0; 20 const ll mod=1e9+7; 21 ll q; 22 ll C(ll x) 23 { 24 ll num=0; 25 while(x) 26 { 27 num+=x/5; 28 x=x/5; 29 } 30 return num; 31 } 32 ll dic(ll M) 33 { 34 ll l=0,r=M; 35 while(l<r) 36 { 37 ll mid=(l+r)/2; 38 ll res=C(mid); 39 if(res<q) l=mid+1; 40 else r=mid; 41 } 42 if(C(l)==q) 43 return l; 44 return 0; 45 } 46 int main() 47 { 48 int t;cin>>t;int cnt=0; 49 while(t--) 50 { 51 cin>>q;ll M=500000000; 52 ll ans=dic(M); 53 if(ans) printf("Case %d: %lld\n",++cnt,ans); 54 else printf("Case %d: impossible\n",++cnt); 55 } 56 }