题目描述
若一个长度为 X正整数,其各位上数字的X次方的和等于其自己,则称该数为水仙花数。例如:153 的长度X=3,且153 = 13+53+33 所以, 153 是水仙花数。现有N 个正整数(10 <= N <= 20),要求从这N个数中任取K个( 2 <=K <=6),并求出这K个数的和,统计和为水仙花数的个数。
输入
第一行是二个整数N K,第二行是N个正整数(每个数均在大于等于10 、小于等于1000 之间)。
输出
一个整数,即满足条件的水仙花数的个数。
样例输入
4 3
40 100 13 27
样例输出
1
来源
2010年江苏省小学生信息学(计算机)奥赛
满分代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,ans=0;
int a[25],c[25],d[25];
bool b[25];
int isshui(int n) {
int temp=n;
int t[20];
int cn=0;
while(temp) {
t[++cn]=temp%10;
temp=temp/10;
}
int s=0;
for(int i=1; i<=cn; i++) {
s=s+pow(t[i],cn);
}
if(s==n)
return 1;
else
return 0;
}
void myprint() {
int temp=0;
for(int i=1; i<=k; i++) {
temp+=d[i];
}
ans+=isshui(temp);
}
void search(int step) {
for(int i=1; i<=n; i++) {
if(!b[i]&&i>c[step-1]) {
b[i]=true;
c[step]=i;
d[step]=a[i];
if(step==k) {
myprint();
} else {
search(step+1);
}
b[i]=false;
}
}
}
int main() {
cin>>n>>k;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
search(1);
cout<<ans;
return 0;
}