凑平方数
把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...
注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。
如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
注意:需要提交的是一个整数,不要填写多余内容。
答案:300
思路:先求出全排列,再对于每个排列组合进行搜索找合法组,再利用哈希进行存储去重。
PS:map在使用次数很大时超级耗时,在求平方数时,我先用map存平方数,结果跑了70s,换成在线求就只用了2s (T_T)
Code:
#include<iostream>
#include<cmath>
#include<map>
using namespace std;
typedef long long LL;
map<LL,bool> dd;
bool boo[15];
bool isqnum(LL num);
void Find(LL p,LL Sum);
void DFS(int k,LL p);
int main()
{
ios::sync_with_stdio(false);
DFS(1,0);
cout<<dd.size()<<endl;
return 0;
}
bool isqnum(LL num){
long double d = sqrt(num);
return d == (LL)d;
}
void Find(LL p,LL Sum)
{
if(!p){
dd[Sum]=true; return;
}
LL t=1,pp=0;
while(p){
pp+=p%10*t;
p/=10; t*=10;
if(isqnum(pp)) Find(p,Sum+pp*pp);
}
}
void DFS(int k,LL p)
{
if(k==11){
Find(p,1); return;
}
for(int i=0;i<=9;++i)
if(!boo[i]){
boo[i]=true;
DFS(k+1,p*10+i);
boo[i]=false;
}
}