阶乘因式分解(二)
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
给定两个数n,m,其中m是一个素数。
将n(0<=n<=2^31)的阶乘分解质因数,求其中有多少个m。
注:^为求幂符号。
-
输入
-
第一行是一个整数s(0<s<=100),表示测试数据的组数
随后的s行, 每行有两个整数n,m。
输出
输出m的个数
解法:
所谓的因数分解就是:
把一个合数分解成若干个质因数的乘积的形式,即求质因数的过程叫做分解质因数。分解质因数只针对合数。(分解质因数也称分解素因数)因此n的阶乘分解质因数的话就可以写成n,n-1,n-2.....2,1分别分解质因数的写法;那么要求分解质因数后式中的m的个数就可以理解成从n!中第一个能被m整出的数x,则在接下来的x-m,x-m-m.......m个数中都可以写成m*y*z...=x的形式,然后设A=x/m,,B=x-m/m=A-1.......0;于是问题又转换成了A!分解因式后中m的个数。例:100 5100=5*20;95 =5*19;。。。。。5=5*1;这一步得到20个520=5*415=5*3。。。。5=5*1这一步得到4个54<5不能在分解,于是更能得到24个5代码:#include<stdio.h> int calculate(int n,int m){ int sum=0; while(n){ sum+=n/m; n/=m; } return sum; } int main() { int n,m; int t,ans; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); ans=calculate(n,m); printf("%d\n",ans); } }
-
第一行是一个整数s(0<s<=100),表示测试数据的组数