NYOJ 56 阶乘因式分解(一)
地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=56
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k,m,n,s; 5 scanf("%d",&s); 6 while(s--) 7 { 8 scanf("%d%d",&n,&m); 9 for(i=m,j=0;i<=n;i++) 10 for(k=i;!(k%m);j++) 11 k=k/m; 12 printf("%d\n",j); 13 } 14 return 0; 15 }
思路:
给定两个数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
从这个表达式中可以提取出k个n,然后按照相同的方法循环下去可以求出k!中因子n的个数。
每次求出n的个数的和就是m!中因子n的总个数。