nyoj 56 nyoj 70 - 阶乘因式分解

http://acm.nyist.net/JudgeOnline/problem.php?pid=70

 

阶乘因式分解(二)

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

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

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

注:^为求幂符号。 

输入
第一行是一个整数s(0<s<=100),表示测试数据的组数
随后的s行, 每行有两个整数n,m。
输出
输出m的个数
样例输入
3
100 5
16 2
1000000000  13

 

nyoj 56是水题,只要按阶乘遍历一遍即可~~

 1  
2 #include<stdio.h>
3 int main()
4 {
5 int ncases;
6 int m, n, i, k;
7 scanf("%d", &ncases);
8 while(ncases--)
9 {
10 int num = 0;
11 scanf("%d%d", &n, &m);
12 for(i = 1; i <= n; i++)
13 {
14 k = i;
15 while(k % m == 0)
16 {
17 k = k / m;
18 num ++;
19 }
20 }
21 printf("%d\n", num);
22 }
23 return 0;
24 }

70题中将范围从10000改到了2^31,如果还遍历的话肯定会超时~~~

例如 求a!因式中有多少个b(b是素数)

那么a / b 表示 在 1 到 a 中所有的数中有a/b个能够整除b

a / (b^2) 表示在 1 到 a 中所有的数中有a/(b^2)个能够整除b^2

......

因此,总共有a/b + a / b^2 + a / b^3 + ...... 直到a/ b^n 等于0

代码如下:

 1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5 int tcases;
6 int n, m;
7 cin >> tcases;
8 while(tcases--)
9 {
10 int k = 0;
11 cin >> n >> m;
12 do
13 {
14 n /= m;
15 k += n;
16 }while(n);
17 cout << k << endl;
18 }
19 return 0;
20 }



posted @ 2011-12-20 22:50  枫萧萧  阅读(769)  评论(1编辑  收藏  举报