阶乘因式分解(二)
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
给定两个数n,m,其中m是一个素数。
将n(0<=n<=2^31)的阶乘分解质因数,求其中有多少个m。
注:^为求幂符号。
-
输入
-
第一行是一个整数s(0<s<=100),表示测试数据的组数
随后的s行, 每行有两个整数n,m。
输出
-
输出m的个数
样例输入
-
3 100 5 16 2 1000000000 13
样例输出
-
24 15 83333329
#include<stdio.h> int main() { int s,n,m,x,i,sum; scanf("%d",&s); while(s--) { scanf("%d%d",&n,&m); sum=0; if(n%m) { n-=n%m; } for(i=n;i>=2;) { x=i; while(x%m==0) { sum++; x=x/m; } i-=m; } printf("%d\n",sum); } return 0; } //思路: //例如,n=100,m=5 //100是由20个5组成的,1~100中是5的倍数的数字有 5,10,15,20,25,30......100 //每10个 数中有两个是5的倍数,所哟1~100中是5的倍数的数字有20个 //从这20个数中各分解出一个5,则有20个5;然后这20个数变成20,19,18.......1 //即20的阶乘变成了求20的阶乘能分解出多少个m //在1~20中又能分解出4个,再往下就不够5了,就结束循环,总共能分解出24个5。 //题目中之所以舍弃1~100中其他不是5的倍数的数,是因为题目让我们求5的倍数,那些数都不是5的倍数,就不可能分解出5这个因子。所以社区也没有关系。 /* 又如,求16的阶乘能分解出多少个2 1~16中是2的倍数的数有2,4,6,8,10,12,14,16,即1~16中2的倍数的数有8个。 再从这8个数中各分解出一个2,则有8个2; 然后这8个数变成1,2,3,4,5,6,7,8; 再从1~8这8个数中各分解出一个2(能分解出2的就分解出一个2,不能分解出2的就舍弃),则有4个2; 这8个数变成 1,2,3,4; 在从1~4中各分解出一个2,(能分解出2的就分解出一个2,不能分解出2的就舍弃),则有2个2; 然后这4个数变成1,2; 再从1~2中各分解出以讴歌2(依然是能分解出2的分解出一个2,不能分解出2的舍弃),则有1个2; 然后这2个数变成1,(1已经不足2,)无法再分分解,就结束循环。 */
-
第一行是一个整数s(0<s<=100),表示测试数据的组数