原题地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=70
原题意思:求n!有多少个m
思路:n! = 1 * 2 * 3...n中只有m的倍数才包含m。
例如 n = 100 , m = 5 ,所以在5,10,15,20...95,100中包含5,这些数有100/5 = 20个,但是有些是例外的,例如25,50,75,100包含两个5。
也就是计算n!里面包含多少个m等价于求 n 整除 m 的个数 加上 n 整除 m平方的个数 加上 n 整除 m平方的个数....的和。
代码:循环遍历m的幂次,计算出n对于m的幂次下的所有和,实际上循环m的幂次小于等于n即可。
#include <iostream>
#include <string.h>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long int LL;
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int t;
LL n, m;
scanf("%d", &t);
while(t--){
scanf("%lld %lld", &n, &m);
LL sum = 0, cnt = m ;
while(cnt <= n){
sum += n / cnt;
cnt *= m;
}
printf("%d\n",sum);
}
return 0;
}