月之数

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2744    Accepted Submission(s): 1585

Problem Description
当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-ing),发现了神奇的二进制数。
如果一个正整数m表示成二进制,它的位数为n(不包含前导0),寒月称它为一个n二进制数。所有的n二进制数中,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对应的月之数。
Sample Input
3 1 2 3
Sample Output
1 3 8
该题题义简单,是求一个二进制数的区间内,1的个数,不知到有木有更好的办法,写这道题时想到的就是一个组合问题。
比如要求一个4二进制数的月之数是多少,由于第一位必须为1,所以有多少个3位的二进制数,就有多少个高位1,后面的就是从N-1个里面选一个,两个...... 这样的组合数,在具体计算过程中还要考虑奇偶性。
代码如下:
 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 using namespace std; 5  6 long long mix( long long n, long long m ) 7 { 8     long long res = 1; 9     for( long long i = 0; i < m; ++i )10     { // 一直用这个学来的方法来防止溢出11         res *= ( n - i );12         res /= ( i + 1 );13     }14     return res;15 }16 17 int main()18 {19     int T;20     scanf( "%d", &T );21     while( T-- )22     {23         long long N, ans = 1;24         scanf( "%I64d", &N );25         for( long long i = 1; i <= N - 1; ++i )26         {27             ans <<= 1;28         }    29         if( ! ( N & 1 ) )30         {31             int lim = N / 2 - 1;32             for( long long i = 1; i <= lim; ++i )33             {34                 ans += ( N - 1 ) * mix( N - 1, i );35             }36             ans += ( N - 1 );37         }38         else39         {40             int lim = ( N - 1 ) / 2;41             for( long long i = 1; i < lim; ++i )42             {43                 ans += ( N - 1 ) * mix( N - 1, i );44             } 45             ans += ( N - 1 ) / 2 * mix( N - 1, ( N - 1 ) / 2 ); 46             ans += ( N - 1 ); 47         }48         printf( "%I64d\n", ans );49     }50     return 0;51 }

  突然想到用移位判定奇偶来统计1的个数,现在就去试试看。

  上面的这种方法也能过,代码量下来了,但是速度慢了 78MS, 前面的是0MS。代码如下:

 1 #include <cstring> 2 #include <cstdlib> 3 #include <cstdio> 4 using namespace std; 5  6 int main() 7 { 8     int T; 9     scanf( "%d", &T );10     while( T-- )11     {12         int N, beg = 1, end = 1, ans = 0;13         scanf( "%d", &N );14         for( int i = 1; i < N; ++i )15             beg <<= 1, end <<= 1;16         end <<= 1, end -= 1;17         for( int i = beg; i <= end; ++i )18         {19             int t = i;20             while( t > 0 )21             {22                 if( t & 1 )23                     ++ans;24                 t >>= 1;25             }26         }27         printf( "%d\n", ans );28     }29     return 0;30 }

  还有一种递推解法,个人觉得很好很强大。 代码如下:

 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 using namespace std; 5  6 int ans[22], base = 1; 7  8 int main() 9 {10     ans[1] = 1;11     for( int i = 2; i <= 20; ++i )12     {13         ans[i] = 2 * ans[i-1] + base;14         base <<= 1;15     }16     int T;17     scanf( "%d", &T );18     while( T-- )19     {20         int N;21         scanf( "%d", &N );22         printf( "%d\n", ans[N] );23     }24     return 0;25 }

  

转载于:https://www.cnblogs.com/Lyush/archive/2011/08/28/2156753.html

HDU-2502 月之数 组合数相关推荐

  1. HDU 2502 月之数(简单递推)

    月之数 Problem Description 当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-ing),发现了神奇的二进制数. 如果一个正整数m表示成二进制,它的位数 ...

  2. HDOJ(HDU) 2502 月之数(进制)

    Problem Description 当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-ing),发现了神奇的二进制数. 如果一个正整数m表示成二进制,它的位数为n(不 ...

  3. HDU2502 月之数(解法三)【废除!!!】

    本文废除,参见以下链接. 参考链接:HDU2502 月之数[递推] 月之数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/ ...

  4. HDU2502 月之数(解法二)【废除!!!】

    本文废除,参见以下链接. 参考链接:HDU2502 月之数[递推] 月之数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/ ...

  5. HDU2502 月之数【递推】

    月之数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  6. Virtual Judge——C - 月之数

    题目介绍 当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-ing),发现了神奇的二进制数. 如果一个正整数m表示成二进制,它的位数为n(不包含前导0),寒月称它为一个n ...

  7. C/C++ 天之痕,月之数

    题目描述 当陈竟仇还在读大一的时候,他在一本武林秘籍中,发现了神奇的二进制数. 如果一个正整数m表示成二进制,它的位数为n(不包含前导0),陈竟仇称它为一个n二进制数.所有的n位二进制数中,1的总个数 ...

  8. HDU 6114 Chess 【组合数】(2017百度之星程序设计大赛 - 初赛(B))

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. hdu 2063+hdu 1083(最大匹配数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 二分匹配水题,求最大匹配数(即求边数最多的匹配),匈牙利算法实现.. View Code 1 # ...

最新文章

  1. SAP_SD常用增强
  2. iOS 导航栏遮挡视图
  3. [转]数据库性能优化(老Key)
  4. 机器学习入门书籍导读-高等数学上
  5. ITK:在不复制数据的情况下,从图像创建样本列表。
  6. java数据结构-Vector
  7. 测试反模式冰激凌模式的不足_单元测试反模式,完整列表
  8. JS学习之表格的排序
  9. 附加属性来控制控件中,要扩展模块的visibility
  10. 如何解除国外听QQ音乐网易音乐地区版权限制解除
  11. 关于VC6和VC9的区别
  12. Photoshop:PS如何实现放大图片不模糊
  13. 什么是一条好链?——一定要有自主创新的硬核技术
  14. 《阿米巴经营》第一章读后感1200字
  15. 运算放大器节点电压方程_区分运算放大器和电压比较器
  16. win10下Linux双系统
  17. 2017-2018 Petrozavodsk Winter Training Camp, Saratov SU Contest C.Cover the Paths 贪心+DFS
  18. EOJ 3322 万年历(历史题)
  19. Go设置一个工作区打开多个项目
  20. 论文阅读笔记:On the Role of Correlation and Abstraction in Cross-Modal Multimedia Retrieval

热门文章

  1. “画大饼”行走江湖的必备技能
  2. 你习惯用微信支付还是支付宝?
  3. The developer claims that Bpytop
  4. In the interview, Clem revealed that his first
  5. c语言程序设计小学生测验,c语言程序设计(1) 小学生计算机辅助教学系统
  6. access子窗体的控件vba怎么写_第37讲:VBA代码中运行错误的处理方式
  7. 使用PowerShell和T-SQL在多服务器环境中规划SQL Server备份和还原策略
  8. 使用SQL Server进行时间点恢复
  9. iPhone X 弹出输入框隐藏后页面上移不回位问题的解决办法
  10. PHP面向对象构造函数,析构函数