nyoj70阶乘因式分解(数学)

来源:互联网 发布:java饭店订餐系统 编辑:程序博客网 时间:2024/04/30 15:18

阶乘因式分解(二)

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

给定两个数n,m,其中m是一个素数。

将n(0<=n<=2^31)的阶乘分解质因数,求其中有多少个m。

注:^为求幂符号。

 

输入
第一行是一个整数s(0<s<=100),表示测试数据的组数
随后的s行, 每行有两个整数n,m。 
输出
输出m的个数
样例输入
3100 516 21000000000  13
样例输出
241583333329
#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,)无法再分分解,就结束循环。  */ 


0 0