HDU-2502 月之数(简单推导)

来源:互联网 发布:sql语句建立table 主键 编辑:程序博客网 时间:2024/05/16 21:56





1.n位数是n位的二进制数,所以一共有  2^(n-1)  个二进制数,每个的的第一位必须是1所以,已经有了  2^(n-1)  个1;

2.再考虑每个二进制数的后n-1位数,因为是可以前导为0,所以1和0的个数最终一定是相同的,所以  2^(n-1) *(n-1)为所有的1和0的个数,除以2得到结果。

所以最终结果是  2^(n-1) + 2^(n-1) *(n-1)/2

打表或者直接输出

#include<cstdio>int a[25];void Init(){    int m = 1;//2^n    for(int i = 1;i <= 20;i++)    {        a[i] = m + m/2*(i-1);        m *= 2;    }}int main(){    Init();    int t,n;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        printf("%d\n",a[n]);    }    return 0;}


0 0