题目:
n的阶乘尾部有q个连续的0,现在给你q,请你算出满足条件的n,如果有多个n满足条件,输出最小的那个即可。
Input
输入一个T(T <= 10000),表示样例数量。
每个样例输入一个q。(1 <= q <= 100,000,000)
Output
对于每个样例,输出满足条件的最小的n,如果没有满足条件的则输出"impossible"。.
Sample Input
3
1
2
5
分析与解答
这题我知道是二分,就是找不出规律
5:1
10:2
25: 6
125 :25+5+1
n:n/5 +n/25+…+1
int C(int x) //计算x后面有几个0
{int ans=0;while(x) {ans+=x/5;x/=5;}return ans;
}
输入一个数m是0的个数,我们让x取值范围从l到r,如果找到一个x刚好等于m,那就说明此时找到x他阶乘末尾有m个零,以前都是找最值,这回找数,看来二分着实厉害
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Max 100000000
using namespace std;
int C(int x) //计算x后面有几个0
{int ans=0;while(x) {ans+=x/5;x/=5;}return ans;
}
int main()
{int t;int cs=1;scanf("%d",&t);while(t--){int q;scanf("%d",&q);int left=0,right=Max;int mid;while(left<=right){mid=(left+right)/2;if(C(mid)>=q)right=mid-1;else left=mid+1;}if(C(left)==q)printf("Case %d: %d\n",cs++,left);elseprintf("Case %d: impossible\n",cs++);}return 0;
}