把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。 比如:0, 36, 5948721
再比如: 1098524736 1, 25, 6390784 0, 4, 289, 15376 等等…
注意,0可以作为独立的数字,但不能作为多位数字的开始。 分组时,必须用完所有的数字,不能重复,不能遗漏。
如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
注意:需要提交的是一个整数,不要填写多余内容。
#include<stdio.h>
#include<string.h>
#include<string>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int ans = 0;
bool judge(long long sum) {
return sqrt(sum) == (long long)(sqrt(sum));
}
void dfs(int m,int n) { // m为最大值 n为现在的位数
if(n==10) {
ans++;
return;
}
if(a[n]==0) {
if(m<0) dfs(0,n+1);
} else{
long long sum = 0;
for(int i=n;i<10;i++) {
sum = sum*10;
sum += a[i];
if(sum>m && judge(sum)) {
dfs(sum,i+1);
}
}
}
}
int main () {
do{
dfs(-1,0);
}while(next_permutation(a,a+10));
printf("%d",ans);
return 0;
}