HDOJ 2502月之数

HDOJ 2502月之数 http://acm.hdu.edu.cn/showproblem.php?pid=2502

可以直接用二进制模拟

但模拟之后却发现有公式

我找到的公式是: a[i] = pow(2,i-1)+(i-1)*pow(2,i-1)/2;

二进制模拟法:

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

         int i,j,k,n,m,t;

         int a[22];

         a[0] = 0;

         a[1] = 1;

         a[2] = 3;

         a[3] = 8;

         m = 8;

         int num = 0;

         for (i=4;i<=20;i++)

         {

                   j = pow(2,i-1); //个数

                   int sum = 0;

                   for (k=0;k<j;k++)

                   {

                            n = m+k;

                            for (t=0;t<i;t++)

                            {

                                     if ((n>>t)&1 == 1)

                                     {

                                               sum++;

                                     }

                            }

                   }

                   m = n+1;

                   a[i] = sum;

         }

//     for (i=0;i<=20;i++)

//     {

//              printf("%d ",a[i]);

//     }

         while (scanf("%d",&t)!=EOF)

         {

                   while (t--)

                   {

                            scanf("%d",&n);

                            printf("%d/n",a[n]);

                   }

         }

         return 0;

}

 

 

公式法:

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

         int i,j,k,n,m,t;

         int a[22];

         for (i=1;i<21;i++)

         {

                   a[i] = pow(2,i-1)+(i-1)*pow(2,i-1)/2;

         //      cout<<a[i] <<" ";

         }

         while (scanf("%d",&t)!=EOF)

         {

                   while (t--)

                   {

                            scanf("%d",&n);

                            printf("%d/n",a[n]);

                   }

         }

         return 0;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值