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 }