HDoj 2502月の数

1892 ワード

月の数
Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7727    Accepted Submission(s): 4560
Problem Description
寒月がまだ大学1年生の時、彼は武林の秘籍の中で(後に考証して、コンピュータの基礎だと推定して、狂汗-ing)、不思議なバイナリ数を発見しました.
正の整数mがバイナリとして表される場合、そのビット数はn(プリアンブル0を含まない)であり、寒月はnバイナリ数と呼ぶ.すべてのn 2進数のうち,1の総個数をnに対応する月の数と呼ぶ.
例えば、3進数は合計4個で、それぞれ4(100)、5(101)、6(110)、7(111)であり、これらのうち1個の数は合計1+2+2+3=8であるため、3に対応する月の数は8である.
 
 
Input
入力データのグループ数を表す整数Tを与え、次にT行があり、各行に正の整数n(1<=n<=20)が含まれます.
 
 
Output
n毎に、nに対応する月の数を1行に出力する.
 
 
Sample Input
3
1
2
3
 
 
Sample Output
1
3
8
 
探しようがない  不器用な方法で  各数値をバイナリ計算1の個数に変換
nごとに対応する月の数が発見されたので  その十進数はいずれも2のn-1次方から2のn次方の間にある.
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAX 1100000
int main()
{
	int n,m,j,i,s,t,l;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		s=0;
		for(i=pow(2,n-1);i<pow(2,n);i++)
		{
			m=i;
			while(m)
			{
				if(m%2==1)
				s++;
				m/=2;
			}
		}
		printf("%d
",s); } return 0; }

 神の考え:
考え方:Nの全バイナリ数はm=2^(N-1)個である.第1の縦列は全部でm個の1があり、その後の第2~Nの縦列のうち、1と0がそれぞれ半分を占め、
全部で(N-1)*m/2個1あります.従って結果ans=m+(N−1)*m/2であった.例えばN=4:N=4: 1000 1001 1010 1011 1100 1101 1110 1111
	#include <cstdio>  
	#include <cmath>  
	  
	int main()  
	{  
	    int t,n,m;  
	    scanf("%d",&t);  
	    while(t--){  
	        scanf("%d",&n);  
	        m=pow(2,n-1);  
	        printf("%d
",m+(n-1)*m/2); } return 0; }