首页 > 代码库 > CDZSC_2015寒假新人(2)——数学 - O
CDZSC_2015寒假新人(2)——数学 - O
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。
如果一个正整数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
3123
Sample Output
138
题解:排列组合,例如n = 3,忽略前面一个1,那么后面就有两个空位,可以填0个1,1个1和2个1,再加回原本的1,那么就是 1 * C(0, 2) + 2 * C(1, 2) + 3 * C(2, 2) = 1 * 1 + 2 * 2 + 3 * 1 = 8, 其他以此类推(注C(a, b) 即为组合数),其中为了简化计算,建了两个表。详见代码。
1 #include <cstdio> 2 #include <cstring> 3 4 const int MAX = 24; 5 int arr[MAX][MAX]; 6 7 int main() 8 { 9 #ifdef CDZSC_OFFLINE10 freopen("in.txt", "r", stdin);11 freopen("out.txt", "w", stdout);12 #endif13 int t, n, sum, ans[MAX];14 memset(arr, 0, sizeof(arr));15 memset(ans, 0, sizeof(ans));16 for(int i = 0; i < MAX; i++)17 {18 arr[i][0] = 1;19 for(int j = 1; j < i; j++)20 {21 arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];22 }23 arr[i][i] = 1;24 }25 for(int i = 1; i < MAX; i++)26 {27 sum = 0;28 for(int j = 1; j <= i; j++)29 {30 sum += j * arr[i - 1][j - 1];31 }32 ans[i] = sum;33 }34 scanf("%d", &t);35 while(t--)36 {37 scanf("%d", &n);38 printf("%d\n", ans[n]);39 }40 return 0;41 }
CDZSC_2015寒假新人(2)——数学 - O
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。