题目

#include<iostream>
#include<cstring>
using namespace std;
const   int N=20;//	N太大会超时
bool st[N];
bool back[N];
int cnt;
    int n; bool check(int a,int c)
{
   
    int x=n*c-a*c;
    if(!a||!c||!x)	return false;
    //printf("%d %d %d %d\n",n,c,a,x);
    memcpy(back,st,sizeof(st)); while(x)
    {
   
    int    t=x%10;
        x/=10;
        if(t==0||back[t]==1)    return false;
        back[t]=1;
    }
    for(int i=1;i<=9;i++)
    if(!back[i]) return false;
    return true;
}
void dfs_c(int u,int a,int c)
{
    
	if(u==n)    return ; if(check(a,c))
       {
    cnt++;  
       }
   
    for(int i=1;i<=9;i++)
    {
   
        if(!st[i])
        {
   
            st[i]=1;
            dfs_c(u+1,a,c*10+i);
            st[i]=0;
        }
    }
}
void dfs_a(int u,int a)
{
   
    if(u==n)    return;
    if(a) dfs_c(u,a,0);
    for(int i=1;i<=9;i++)
    {
   
        if(!st[i])
        {
   
            st[i]=1;
            dfs_a(u+1,a*10+i);
            st[i]=0;
        }
    }
}
int main()
{
   
    cin>>n;
    dfs_a(0,0);
    printf("%d\n",cnt);
    return 0;
}