Problem B: Zhazhahe究竟有多二
Description
Zhazhahe竟然能二到把耳机扔到洗衣机里去洗,真的是二到了一种程度,现在我们需要判断一下zhazhahe二的程度(就是计算zhazhahe的脑残值有几个2的因子),下面给你一个n,n!表示zhazhahe的脑残值。
Input
输入一个正整数t(0<t<3000)表示样例组数,每组样例输入一个正整数n(0<n<1e18),n!表示zhazhahe的脑残值
Output
输出一个正整数表示zhazhahe二的程度
Sample Input
3
2
4
15
Sample Output
1
3
11
【分析】
没什么大问题....考虑到数据1e18所以需要一个高效的算法..直接敲了一遍就A掉了...
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的个数
【代码】
#include <stdio.h>
int main()
{
int pp;scanf("%d",&pp);
while (pp--)
{
long long n;scanf("%lld",&n);
long long ans=0;
while (n)
{
ans+=n/2;
n/=2;
}
printf("%lld\n",ans);
}
}
int main()
{
int pp;scanf("%d",&pp);
while (pp--)
{
long long n;scanf("%lld",&n);
long long ans=0;
while (n)
{
ans+=n/2;
n/=2;
}
printf("%lld\n",ans);
}
}