把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。 比如:0, 36, 5948721

再比如:

1098524736
1, 25, 6390784
0, 4, 289, 15376

等等...

注意,0可以作为独立的数字,但不能作为多位数字的开始。 分组时,必须用完所有的数字,不能重复,不能遗漏。

如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?

注意:需要提交的是一个整数,不要填写多余内容。

答案:

 

先找出所有的范围内无重复数字的平方数,并记录位数,然后dfs。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
ll s[1000];
int nu[1000];
int ans,c;
bool vi[10];
void in(ll k,bool va) {
    do {
        vi[k % 10] = va;
        k /= 10;
    }
    while(k);
}
bool check(ll k) {
    bool vis[10] = {false};
    while(k) {
        if(vis[k % 10]) return false;
        vis[k % 10] = true;
        k /= 10;
    }
    return true;
}
bool check1(ll k) {
    do {
        if(vi[k % 10]) return false;
        k /= 10;
    }
    while(k);
    return true;
}
void dfs(int num,int k) {
    if(!num) {
        ans ++;
        return;
    }
    for(int i = k;i < c;i ++) {
        if(nu[i] > num) return;
        if(check1(s[i])) {
            in(s[i],true);
            dfs(num - nu[i],i + 1);
            in(s[i],false);
        }
    }
}
int main() {
    nu[c ++] = 1;
    for(ll i = 1;i * i <= 9876543210;i ++) {
        if(check(i * i)) {
            nu[c] = log10(i * i) + 1;
            s[c ++] = i * i;
        }
    }
    dfs(10,0);
    cout<<ans;
}