1 条题解
-
0
题意分析
杰克叔叔有 张独一无二的 CD,要分给 个侄子。每个侄子可以分到任意数量的 CD(包括 0 张)。题目要求计算所有可能的分配方式的总数。
由于每张 CD 都是不同的,因此分配方式需要考虑 CD 的排列组合。例如:
- 如果 (侄子 A 和 B),(CD1 和 CD2),那么可能的分配方式有:
- A: CD1, CD2;B: 无
- A: CD1;B: CD2
- A: CD2;B: CD1
- A: 无;B: CD1, CD2
共 种方式,即 。
解题思路
由于每张 CD 可以独立地分配给任何一个侄子,因此:
- 第 1 张 CD 有 种选择(给任意一个侄子)。
- 第 2 张 CD 也有 种选择(不受前一张影响)。
- ……
- 第 张 CD 仍然有 种选择。
因此,总分配方式数为:
即 的 次方。
算法实现
直接计算 即可。由于 且 , 可以用
long long
存储(在 C++ 中,pow(N, D)
或循环计算均可)。标程
#include<stdio.h> #include<string.h> #define max 105 char str[max]; int b[max+10],z[max*max+10]; int s[max*max+10]; void mi(int b[],int z[],int k) { int i,j; memset(s,0,sizeof(s)); for(i=0;i<k;i++) for(j=0;j<max*max;j++) s[i+j]+=b[i]*z[j]; for(i=0;i<max*max;i++) { if(s[i]>=10) s[i+1]+=s[i]/10; z[i]=s[i]%10; } } int main() { int i,j,k,n,m; while(~scanf("%s%d",str,&n)) { memset(z,0,sizeof(z)); k=strlen(str); if(k==1&&str[0]=='0'&&n==0) break; j=0; m=0; if(k==2&&str[0]=='1'&&str[1]=='0') { printf("1"); for(i=1;i<=n;i++) printf("0"); printf("\n"); continue; } if(n==0) { printf("1\n"); continue; } for(i=0;i<k;i++) { b[j++]=str[i]-'0'; z[m++]=str[i]-'0'; } n--; while(n) { mi(b,z,k); n--; } for(i=max*max-1;i>=0;i--) { if(z[i]==0) continue; else break; } memset(str,0,sizeof(str)); for(;i>=0;i--) printf("%d",z[i]); printf("\n"); } return 0; }
- 如果 (侄子 A 和 B),(CD1 和 CD2),那么可能的分配方式有:
- 1
信息
- ID
- 2200
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者