NYOJ 70-阶乘因式分解(二)

题目地址:NYOJ 70

思路:n!=(1*2*3*4*......*(n-1)*n)=(m*2m*3m*.....*(k-1)m*km)*其他=(1*2*3*....*k)*m*其它 。其中km是最大值,km<=n所以k的最大值是n/m,所以[1,n]中有n/m个数能被n整除,

然后[1,n]中每个数除以m,就剩了[1,n/m],然后继续根据上面的步骤进行运算,一直到n=0的时候结束,所得的结果和为最终的结果.

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
int main()
{
    int T,n,m,i;
    LL sum;
    scanf("%d",&T);
    while(T--){
        scanf("%d %d",&n,&m);
        sum=0;
        while(n){
            sum+=n/m;
            n=n/m;
        }
        printf("%d\n",sum);
    }
    return 0;
}



你可能感兴趣的:(NYOJ,数论,数学,因式分解)