zoukankan      html  css  js  c++  java
  • 整除问题(王道*)

    题目描述

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

    输入

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

    输出

      一个整数

    样例输入

      6 10

    样例输出

      1

    #include <iostream>
    #include<string.h>
    #include<cstdio>
    using namespace std;
    
    bool mark[1010];
    int prime[1010];
    int primesize;
    
    void init(){
        primesize = 0;
        for(int i=2;i<=1000;i++){
            if(mark[i])
                continue;
            prime[primesize++] = i;
            for(int j=i*i;j<=1000;j+=i)
                mark[j] = true;
        }
    }//筛选素数
    
    int cnt[1010];
    int cnt2[1010];
    
    int main()
    {
        int n,a;
        init();
        scanf("%d %d",&n,&a);
        memset(cnt,0,sizeof(cnt));
        memset(cnt2,0,sizeof(cnt2));
        for(int i=0;i<primesize;i++){
            int t=n;
            while(t){//确定素数prime[i]在n中的因子数
                cnt[i] += t/prime[i];
                t /= prime[i];
            }//依次计算t/prime[i]^k,累加其值,直到t/prime[i]^k变为0
        }
        int ans = 123123123;//答案初始值为一个大整数,为取最小值做准备
        for(int i=0;i<primesize;i++){//对a分解素因数
        while(a % prime[i] == 0){
            cnt2[i]++;
            a /= prime[i];
        }//计算a中素因数prime[i]对应的幂指数
        if(cnt2[i] == 0)//若该素数不能从a中分解到,即其对应的幂指数为0,跳过
            continue;
        if(cnt[i]/cnt2[i] < ans)//计算素数prime[i]在两个数中因子数的商
            ans = cnt[i]/cnt2[i];//统计这些商的最小值
        }
        printf("%d
    ",ans);
        return 0;
    }

    要确定最大的非负整数k,只需要依次测试a中每一个素因数,确定b中该素因数对应的幂指数是a中幂指数的几倍,倍数最小的那个就是需要的k。

    不能计算出n!之后再进行分解质因数,n!实在是太大了。。。

    试着考虑一下n!中含有素因数p的个数,即确定素因数p对应的幂指数。我们可以知道,n!包含了1到n区间的所有证书的乘积,这些乘积中每一个p的倍数都对n!贡献了至少一个p因子,且从1到n中p的倍数共有n/p(整数除法)个,则p的因子数至少为n/p个,即有n/p个整数至少贡献了一个p因子。那么所有p*p的倍数将为n!贡献至少两个p因子,这样的整数有n/(p*p)个,依此类推。

  • 相关阅读:
    20199118 2019-2020-2《网络攻防实践》第七周作业
    20199118 2019-2020-2 《网络攻防实践》第六周作业
    20199118 2019-2020-2 《网络攻防实践》第五周作业
    20199118《网络攻防实践》第四周作业
    C#调用webservice 不用默认配置文件 直接在构造函数配置地址
    SQL 字符串分隔函数
    查询Sqlserver数据库死锁的一个存储过程
    C# 守护进程 Windows服务 启动 exe
    SQLSERVER 存储过程中的事务
    EFCore连接Mysql DBFirst模式生成model
  • 原文地址:https://www.cnblogs.com/xym4869/p/8572337.html
Copyright © 2011-2022 走看看