把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; }