原题链接
思路:用一个全排序加去重即可。这里每个排列都用循环遍历乘的位置。一开始用set来去重,但是后来想了想,有可能出现不同的排列且排列分开成a和b不同但出现值相等的情况。其实直接统计答案最后/2即可。因为产生一个对答案贡献的排列,那么必然有相反b和a等于该排列的a和b
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[15]={9,2,1,3,8,5,6,7,4},res=0,vis[12],temp1;
bool fun(int x)
{
int t1=0,t2=0;
for(int i=x,j=1;i>=0;i--,j*=10){
t1=a[i]*j+t1;
}
for(int i=8,j=1;i>x;i--,j*=10){
t2=a[i]*j+t2;
}
// cout<<t1<<' '<<t2<<'\n';
temp1=t1*t2;
int temp=temp1;
memset(vis,0,sizeof(vis));
while(temp){
vis[temp%10]=1;
temp/=10;
}
for(int i=1;i<=9;i++){
if(!vis[i])return false;
}
return true;
}
int main()
{
for(int i=0;i<9;i++)
a[i]=i+1;
// for(int i=0;i<8;i++)
// cout<<fun(i)<<'\n';
set<int>st;
do{
for(int i=0;i<8;i++){
if(fun(i)){
st.insert(temp1);
res++;
}
}
}while(next_permutation(a,a+9));
cout<<res/2<<'\n';
// cout<<st.size()<<'\n';
return 0;
}
//1625---用set统计会出错,原因是某个数可能会被不同的数相乘