zoukankan      html  css  js  c++  java
  • UVa 10780

    Description

    The problem statement is very easy. Given a number n you have to determine the largest power of m, not necessarily prime, that divides n!.

    Input

    The input file consists of several test cases. The first line in the file is the number of cases to handle. The following lines are the cases each of which contains two integers m ((1 lt m lt 5000)) and n ((0 lt n lt 10000)). The integers are separated by an space. There will be no invalid cases given and there are not more that 500 test cases.

    Output

    For each case in the input, print the case number and result in separate lines. The result is either an integer if m divides n! or a line "Impossible to divide" (without the quotes). Check the sample input and output format.

    Sample Input

    2
    2 10
    2 100

    Sample Output

    Case 1:
    8
    Case 2:
    97

    Resume

    对给定的数n,求出m的最大幂次,使得m的该幂次可以整除n!。

    Analysis

    考虑到标准分解$$ x=prod_{i = 1}^n {{p_i} ^{alpha_i} quad ext{where (p_i) is a prime number.}} $$以及指数的乘法法则,我们只需要对小于等于n的每一个数标准分解,求出每个素数对应指数之和,与m的标准分解指数作比较即可得到最大幂次。
    其中需要用素数筛(线性筛)预处理素数集数组。
    为了降低一点时间复杂度,还破天荒地提前读入每一组数据做了个排序(逃。

    Code

    //////////////////////////////////////////////////////////////////////
    //Target: UVa 10780 - Again Prime? No Time
    //@Author: Pisceskkk
    //Date: 2019-2-16
    //////////////////////////////////////////////////////////////////////
    
    #include<cstdio>
    #include<algorithm>
    #define N 10005
    #define Min(a,b) (a<b?a:b)
    #define Max(a,b) (a>b?a:b)
    
    using namespace std;
    
    int t,lm[N],ln[N],num[N],pow_m[N],pow_n[N],ans[N],max_j;
    
    int primes[N],num_p;
    bool is_prime[N];
    bool comp(int a,int b){return ln[a]<ln[b];}
    void sieve(int x){
        num_p = 0;
        is_prime[0] = is_prime[1] = 1;
        for(int i=1;i<=x;i++){
            if(is_prime[i] == 0){
                primes[num_p++] = i;
            }
            for(int j=0;j<num_p && i*primes[j] <= x;j++){
                is_prime[i*primes[j]] = 1;
                if(i%primes[j] == 0)break;
            }
        }
    }
    
    
    
    int main(){
        scanf("%d",&t);
        for(int c=1;c<=t;c++){
            scanf("%d %d",&lm[c],&ln[c]);
            num[c]=c;
        }
        sieve(N-1);
        sort(num+1,num+1+t,comp);
        for(int x=1;x<=t;x++){
            int m=lm[num[x]],n=ln[num[x]];
            ans[num[x]] = N;
            max_j = 0;
            for(int i=0;i<=n;i++)pow_m[i]=0;
            for(int i=ln[num[x-1]]+1;i<=n;i++){
                int x = i;
                for(int j=0;primes[j]<=x && j < num_p;j++){
                    int k=0,p=primes[j];
                    while(x%p == 0)p*=primes[j],k++;
                    x = 1ll*x*primes[j]/p;
                    pow_n[j]+=k;
                    max_j = Max(max_j,j);
                }
            }
            for(int j=0;primes[j]<=m && j < num_p;j++){
                int k=0,p=primes[j];
                while(m%p == 0)p*=primes[j],k++;
                pow_m[j]=k;
                max_j = Max(max_j,j);
            }
            for(int j=0;j <= max_j;j++){
                if(pow_m[j] != 0){
                    ans[num[x]] = Min(ans[num[x]],pow_n[j]/pow_m[j]);
                }
            }
        }
        for(int i=1;i<=t;i++){
            if(ans[i]){
                printf("Case %d:
    %d
    ",i,ans[i]);
            }
            else{
                printf("Case %d:
    Impossible to divide
    ",i);
            }
        }
        return 0;
    }
    
    我思故我在
  • 相关阅读:
    request.getParameter() 和request.getAttribute() 区别
    Java中this和super的用法总结
    jQuery实现列表框双向选择操作
    Eclipse中.setting目录下文件介绍
    通过Ajax方式上传文件,使用FormData进行Ajax请求
    ASP.NET程序中常用的三十三种代码
    计算地球上两个坐标点(经度,纬度)之间距离sql函数
    动态调用WebService(C#) (非常实用)
    带SoapHeader验证的WebServices
    GridView内容详解(转载)
  • 原文地址:https://www.cnblogs.com/pisceskkk/p/10421387.html
Copyright © 2011-2022 走看看