阶乘因式分解(一)
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
给定两个数m,n,其中m是一个素数。
将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m。
-
输入
-
第一行是一个整数s(0<s<=100),表示测试数据的组数
随后的s行, 每行有两个整数n,m。
输出
- 输出m的个数。 样例输入
-
2 100 5 16 2
样例输出
-
24 15
解题思路:对于这道题无需把n的阶乘算出来再求有多少个m,可分别对每个n进行判断包含多少个m(判断方法:如果n对m取余等于0,证明n中至少包含一个m再去对n除以m的结果d[i]进行判断是否对m取余是否等于0,结束条件:d[i]%2 !=0)只要满足d[i]%m == 0则累加,最后可得出结果
代码如下:
#include<stdio.h> int main() { int n,m; int count=0; int i=0; int num; scanf("%d",&num); while(num--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { if(i%m == 0) { int val = i; while(val>=0) { if(val%m ==0) { count++; val = val/m; } else break; } } } printf("%d\n",count); count =0; } return 0; }
效率更高的是递归:
对质数5:
-
5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100...
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20...
-
1 2 3 4....
-
我们发现:5 10 15 20都只能被5除一次,然后25能被5除两次,则共计6次:6 = 25/5 + 5/5 ;
-
对于30 35 40 45也只能被5除一次,然后50能除两次,50以内共计12次:12=50/5 +10/2;
-
...
-
总结规律:
-
f(n,m) = f(n/m,m) +n/m;
-
n==0为结束条件
-
代码如下:
-
#include<iostream> using namespace std; int get(int n,int num) { if(n==0) return 0; else return get(n/num,num)+n/num; } int main() { int n; cin>>n; while(n--) { int a,b; cin>>a>>b; cout<<get(a,b)<<endl; } }
-
第一行是一个整数s(0<s<=100),表示测试数据的组数