nyoj70阶乘因式分解(数学)

阶乘因式分解(二)

时间限制: 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,)无法再分分解,就结束循环。 
 */ 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值