整除问题-阶乘分解质因数

题目链接:

原博链接【代码来自于这篇博客】:https://blog.csdn.net/m0_37036984/article/details/79024534

证明链接【证明来自于这篇博客】:https://blog.csdn.net/jiangpengna/article/details/38690023

题目描述

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

输入描述:

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

输出描述:

一个整数.
示例1

输入

复制
6 10

输出

复制
1
#include   
bool a[1001];  
int b[1001];   
int size;  
void Init(){    
        size =0;    
        for(int i=2;i<=1000;i++){    
            if(a[i]==true) continue;  
            b[size++]=i;    
            if(a[i]==false){    
                for(int j=i*i;j<=1000;j+=i){    
                    a[j]=true;                  
                }    
            }    
        }            
} //求1~1000所有素数   
int cnt1[1001],cnt2[1001];    
int main(int argc, char *argv[])  
{  
    int n,a;  
    while(scanf("%d%d",&n,&a)==2){  
        Init();  
        for(int i=0;i

/*给定两个数m,n
m!分解质因数后因子n的个数。
这道题涉及到了大数问题,如果相乘直接求的话会超出数据类型的范围。
下面给出一种效率比较高的算法,我们一步一步来。
m!=1*2*3*……*(m-2)*(m-1)*m
可以表示成所有和n倍数有关的乘积再乘以其他和n没有关系的
=(n*2n*3n*......*kn)*ohter other
是不含n因子的数的乘积因为kn<=m k肯定是最大值所以k=m/n
=n^k*(1*2*......*k)*other 
=n^k*k!*other

从这个表达式中可以提取出kn,然后按照相同的方法循环下去可以求出k!中因子n的个数。
每次求出n的个数的和就是m!中因子n的总个数。*/

//1.求1-10000的素数,如果判断当前数x是素数,那么就从x*x开始标记其不是素数。

2.求n!中有多少个k(素数),那么就循环相除,结果相加即可。

3.如果两个数可以整除的话,那么就是它们的素因数可以抵消。

4.最后对应n!的素数个数对应a的素数个数数组相除,最小的就是k的值(至于这一点为什么,我也不知道==||)

//学到了不少。2h


你可能感兴趣的:(基础算法)