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
Sample Output
即计算N的阶乘的中有几个2 的因子
如8有 2*2*2 有3个2的因子
首先我们要算n的阶乘; 好吧 你想到这 恭喜你 你要超时
那怎么办?
我只好告诉你 数学方法优化····
直接搞数学方法计算;
如 n=10 时
n!=1*2*3*4*5*6*7*8*9*10;
那么其实有2的因子的只有 2 4 6 8 10
其实我也可以写成
n!=1*(1*2)*3*(2*2)*5*(2*3)*7*(2*4)*9*(2*5)
那么我其实找阶乘中偶数就行了 10有5个偶数(奇数直接忽略掉(不是2的倍数))
偶数有5个
然后 仔细观察 有些是 不止有一个2 的因子 如(2*2) 还有)(2*4)
回过来看 那5个有2的因子的数经过我一顿乱搞 (2的因子都提出来)
由(1*2)*(2*2)*(2*3)*(2*4)*(2*5)
变成了 1*2*3*4*5 (奇数与结果无关 ,不用看)
那么我接着还能提
变成 1*(1*2)*3*(2*2)*5
还是2的倍数有2的因子
那我还找有几个2的倍数的数 再除以2
有2个 此时2的因子总数有 5 + 2个了
现在又变成 1*(1.*2)
同理
总数为5+2+1
下面代码招呼
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long n,num=0;
scanf("%lld",&n);
while(n)
{
num=num+(n/2);
n=n/2;
}
printf("%lld\n",num);
}
}
代码很短吧···真的 别说学数学没用了,那毕竟是启发思维的,数学学好了 人聪明,想事情能从多方面考虑,还考虑的周全
好了 我默默去学数学了
警醒以后的自己