#include <algorithm>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <set>
#include <sstream>
using namespace std;
map<int,int>visit;
set<string>str;
int a[10];
long long have[10];
bool check(long long x){
long long k=sqrt(x);
if(k*k==x) return true;
else return false;
}
void dfs(int x,int y){
if(x==10){
long long arr[10];
copy(have,have+y,arr);
sort(arr,arr+y);
//sort(have,have+y);
//直接用have排序回溯时会产生错误
string s;
ostringstream os;
for(int i=0;i<y;i++){
os<<arr[i];
//cout<<os.str();
s+=os.str()+'-';
}
str.insert(s);
return ;
}
if(a[x]==0){
have[y]=0;
dfs(x+1,y+1);
return ;
}
long long num=0;
for(int i=x;i<10;i++){
num=num*10+a[i];
if(check(num)){
have[y]=num;
dfs(i+1,y+1);
}
}
}
int main(){
for(int i=0;i<10;i++) a[i]=i;
do{
dfs(0,0);
}while(next_permutation(a,a+10));
cout<<str.size()<<endl;
return 0;
}
#include <iostream>
#include <cstdio>
#include <math.h>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <set>
#include <sstream>
using namespace std;
map<int,int>visit;
set<string>str;
int a[10];
long long have[10];
bool check(long long x){
long long k=sqrt(x);
if(k*k==x) return true;
else return false;
}
void dfs(int x,int y){
if(x==10){
long long arr[10];
copy(have,have+y,arr);
sort(arr,arr+y);
//sort(have,have+y);
//直接用have排序回溯时会产生错误
string s;
ostringstream os;
for(int i=0;i<y;i++){
os<<arr[i];
//cout<<os.str();
s+=os.str()+'-';
}
str.insert(s);
return ;
}
if(a[x]==0){
have[y]=0;
dfs(x+1,y+1);
return ;
}
long long num=0;
for(int i=x;i<10;i++){
num=num*10+a[i];
if(check(num)){
have[y]=num;
dfs(i+1,y+1);
}
}
}
int main(){
for(int i=0;i<10;i++) a[i]=i;
do{
dfs(0,0);
}while(next_permutation(a,a+10));
cout<<str.size()<<endl;
return 0;
}