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