阶乘因式分解(二)
时间限制:
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
-
这道题目如果挨着分析每一个乘项就一定会超时,所以要怎么做呢?
-
假设n个里面m,2m....一共有n/m个数字能被m整除,那么这m这数字一定至少有一个m那么就有n/m个m
-
那么这n/m个数字钟能被m^2整除的一定有n/(m*m)个还存在一个m因子的数,那么就有n/m+n/(m*m)个m了
-
...
-
只到n/m=0表示剩下的数没有多余的m了
-
#include<iostream> using namespace std; int main() { int ncase; cin>>ncase; while(ncase--) { int n,m; cin>>n>>m; int cnt=0; //第一次是m,2m,3m....里边有一个m,这些数一共有n/m个 //剩下的n/m个数还能被m整除的是n/m/m个 //剩下的。。。。。 while(n/m!=0) { cnt+=n/m; n/=m; } cout<<cnt<<endl; } }