0
点赞
收藏
分享

微信扫一扫

GDUT新生赛—B

两岁时就很帅 2022-09-07 阅读 64


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);
}
}

举报

相关推荐

0 条评论