整除问题(王道)

Posted Shaw_喆宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整除问题(王道)相关的知识,希望对你有一定的参考价值。

题目描述

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

输入

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

输出

  一个整数

样例输入

  6 10

样例输出

  1

 

(说实话,我这个没太看懂来着,也没仔细看,王道书的P82)

#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\n",ans);
    return 0;
}

 

以上是关于整除问题(王道)的主要内容,如果未能解决你的问题,请参考以下文章

伪代码

(王道408考研操作系统)第二章进程管理-第三节9:读者写者问题

程序员朋友们,赚钱才是王道!

(王道408考研数据结构)第六章图-第四节3:最短路径之BFS算法(思想代码演示答题规范)

(王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想代码演示答题规范)

(王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想代码演示答题规范)