求n!中某个因子个数【模板】

来源:互联网 发布:编译arm linux内核4.5 编辑:程序博客网 时间:2024/05/21 22:26

Problem B: Zhazhahe究竟有多二

Description

Zhazhahe竟然能二到把耳机扔到洗衣机里去洗,真的是二到了一种程度,现在我们需要判断一下zhazhahe二的程度(就是计算zhazhahe的脑残值有几个2的因子),下面给你一个nn!表示zhazhahe的脑残值。

Input

输入一个正整数t(0<t<3000)表示样例组数,每组样例输入一个正整数n(0<n<1e18)n!表示zhazhahe的脑残值

Output

输出一个正整数表示zhazhahe二的程度

Sample Input

32415

Sample Output

1311
#include<iostream>#include<stdlib.h>#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#include<math.h>using namespace std;int main(){    int t;    long long n;    cin>>t;    while(t--)    {        while(cin>>n)        {            long long sum = 0;            while(n/2!=1)            {                sum += n/2;                n = n/2;            }            sum += 1;            cout<<sum<<endl;        }    }}

#include<iostream>#include<cstdio>#include<string.h>#include<cmath>#include<algorithm>using namespace std;long long n;long long geshu(long long n){    long long num=0;    while(n)    {        num+=n/2;        n/=2;    }    return num;}int main(){    int t;    cin>>t;    while(t--)    {        cin>>n;        cout<<geshu(n)<<endl;    }    return 0;}



求n的阶乘某个因子a的个数,如果n比较小,可以直接算出来,但是如果n很大,此时n!超出了数据的表示范围,这种直接求的方法肯定行不通。其实n!可以表示成统一的方式。

n!=(k^m)*(m!)*a 其中k是该因子,m=n/k,a是不含因子k的数的乘积

下面推导这个公式

n!=n*(n-1)(n-2)……3*2*1

=(k*2k*3k…..*mk)*a a是不含因子k的数的乘积,显然m=n/k;

=(k^m)*(1*2*3…*m)*a

=k^m*m!*a

接下来按照相同的方法可以求出m!中含有因子k的个数。

因此就可以求除n!中因子k的个数

int count(int n,int k){    int num=0;    while(n)    {        num+=n/k;        n/=k;    }    return num;}




0 0
原创粉丝点击