zoukankan      html  css  js  c++  java
  • 九度OJ 1104:整除问题 (整除、因式分解)

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:4142

    解决:1346

    题目描述:

    给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

    输入:

    两个整数n(2<=n<=1000),a(2<=a<=1000)

    输出:

    一个整数.

    样例输入:
    6 10
    样例输出:
    1
    来源:
    2011年上海交通大学计算机研究生机试真题

    思路:

    对a进行因式分解,记录素因子以及个数。计算n!过程中,累加记录的相关素因子个数,直到所有的素因子个数都超过a的素因子个数乘(k+1),这时的n减去1就是答案。

    但该题如果给定输入数据不当,可能会存在bug,即对所有的k,都同时满足或同时不满足被a^k整除和被a^(k+1)整除。


    代码:

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
     
    #define N 1000 
         
    int p[N+1], cp;
         
    typedef struct node {
        int num;
        int count;
        int acount;
    } PP;
     
    PP pa[N+1];
    int cpa;
         
    int isprime(int x) 
    {           
        for (int i=2; i<=sqrt(x); i++)
        {
            if (x%i == 0)
                return 0;
        }
        return 1;
    }   
         
    void getPrimes(int x)
    {   
        int i = 1;
        cpa = 0;
        while (x != 1)
        {       
            if (x % p[i] == 0)
            {   
                cpa ++;
                pa[cpa].num = p[i];
                pa[cpa].count = 0;
                while (x % p[i] == 0)
                {
                    pa[cpa].count ++;
                    x /= p[i];
                }
            }
            i ++;
        }
    }
     
    int main(void)
    {
        int n, a, k, i, j, r;
     
        cp = 0;
        for (i=2; i<=N; i++)
        {
            if (isprime(i))
                p[++cp] = i;
        }
     
        //for (i=1; i<=cp; i++)
        //  printf("%d ", p[i]);
        //printf("
    ");
     
        while (scanf("%d%d", &n, &a) != EOF)
        {
            getPrimes(a);
            for (r=1; r<=cpa; r++)
                pa[r].acount = 0;
            for(i=2; i<=n; i++)
            {
                j = i;
                r = 1;
                while (j != 1)
                {
                    if (r > cpa)
                        break;
                    while (j%(pa[r].num) == 0)
                    {
                        pa[r].acount ++;
                        j /= (pa[r].num);
                    }
                    r ++;
                }
            }
            k = pa[1].acount/pa[1].count;
            for (r=2; r<=cpa; r++)
            {
                int kk = pa[r].acount/pa[r].count;
                if (kk < k)
                    k = kk;
            }
            printf("%d
    ", k);
            //for (r=1; r<=cpa; r++)
            //  printf("%d %d %d
    ", pa[r].num, pa[r].count, pa[r].acount);
        }
         
        return 0;
    }       
    /**************************************************************
        Problem: 1104
        User: liangrx06
        Language: C
        Result: Accepted
        Time:10 ms
        Memory:944 kb
    ****************************************************************/


    编程算法爱好者。
  • 相关阅读:
    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建
    Spring Cloud Feign 总结
    Spring Cloud Eureka 总结
    基于Shiro,JWT实现微信小程序登录完整例子
    解决JPA懒加载典型的N+1问题-注解@NamedEntityGraph
    一个微服务+DDD(领域驱动设计)的代码结构示例
    造轮子-AgileConfig基于.NetCore的一个轻量级配置中心
    ASP.NET Core Blazor 初探之 Blazor WebAssembly
    .Net Core
    AServer
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083928.html
Copyright © 2011-2022 走看看