【二分 && 唯一分解定理】LightOJ

来源:互联网 发布:spring编程步骤 编辑:程序博客网 时间:2024/06/05 01:53

Problem Description

N! 后面有Q个0,问你第一个后面有Q个0的N!。输出N,找不到输出impossible

思路:

N! = p1^a1 * p2^a2 * … * pn^an。那么后面0的个数就是min(2的指数,5的次数)。由于2比5多,所以我们只考虑5
100! 有几个0,100/5 = 20, 20/5 = 4, 4/5 = 0 所以100! 后有 20+ 4 = 24个0。
接着我们只需要二分答案即可

#include<bits/stdc++.h>using namespace std;int solve(int mid)//mid!后面几个0{    int res = 0;    while(mid)    {        res += mid / 5;        mid = mid / 5;    }    return res;}int main(){    int T, Case = 1, n, mid;    scanf("%d", &T);    while(T--)    {        scanf("%d", &n);        int l = 1, r = 1000000000;        int flag = 0;        while(l <= r)        {            mid = (l + r) / 2;            int res = solve(mid);            if(res >= n)            {                r = mid - 1;                if(res == n) flag = 1;//代表肯定有解            }            else l = mid + 1;        }        if(flag)//有答案        printf("Case %d: %d\n", Case++, r + 1);        else printf("Case %d: impossible\n", Case++);    }}
原创粉丝点击