打卡
1.考虑数字大小,在468时没有结果了,其原因在于没有用longlong:有些时候小数对却大数错,就要考虑是不是int不够用
2.整体思路就是b=(n-a)c
然后用先a再c,dfs每个数
至于数要怎么选,就用 i+a10 一位一位地选 ,这样就不是从1—n的暴力了
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
#include<stack>
#include <cstring>
#include<string>
#include<queue>
using namespace std;
const int N=1e6;
bool have[10],have2[10];
int n;
int ansnum=0;
bool right(int a,int c)
{
long long b = n * (long long)c - a * c;
memcpy(have2,have,sizeof have);
while(b)
{
int number=b%10;
if(number==0||have2[number])return false;
have2[number]=1;
b/=10;
}
for(int i=1;i<=9;i++)
if(!have2[i])return false;
return true;
}
void dfs_c(int num,int a,int c)
{
if(num>=10)return;
if(right(a,c))ansnum++;
for(int i=1;i<10;i++)
{
if(!have[i])
{
have[i]=1;
dfs_c(num+1,a,i+c*10);
have[i]=0;
}
}
}
void dfs_a(int num,int a)
{
if(a>=n)return;
if(a)dfs_c(num,a,0);
for(int i=1;i<10;i++)
{
if(!have[i])
{
have[i]=1;
dfs_a(num+1,i+a*10);
have[i]=0;
}
}
}
//用每位来判断
int main()
{
cin>>n;
dfs_a(0,0);
cout<<ansnum;
}