题目链接:带分数
 
解题思路:要使得
    
     
      
       
        n
       
       
        =
       
       
        a
       
       
        ∗
       
       
        
         b
        
        
         c
        
       
      
      
       n=a*{ b \over c}
      
     
    n=a∗cb 先搜索a,在当前a的情况下搜索c,
    
     
      
       
        b
       
       
        =
       
       
        n
       
       
        ∗
       
       
        c
       
       
        −
       
       
        a
       
       
        ∗
       
       
        c
       
      
      
       b=n*c-a*c
      
     
    b=n∗c−a∗c,然后检查一下是否合法,合法则答案++。
 
#include<bits/stdc++.h>
#define x first
#define y second
#define mem(h) memset(h,-1,sizeof h)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
typedef long long LL;
typedef unsigned long long ull; 
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
namespace IO{
	inline LL read(){
		LL o=0,f=1;char c=getchar();
		while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
		while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();}
		return o*f;
	}
}using namespace IO;
const int N=1e3+7,M=2e3+7,INF=0x3f3f3f3f,mod=1e9+7,P=131;
bool st[11],bk[11];
int n,ans;
int check(int a,int c){
	LL b= n*(LL)c-a*c;
	if(!a||!b||!c)return false;
	
	mcp(bk,st);
	while(b){
		int x=b%10;
		b/=10;
		if(!x||bk[x])return false;
		bk[x]=1;
	}
	
	for(int i=1;i<=9;i++){
		if(!bk[i])return false;
	}
	return true;
}
void dfs_c(int a,int c){
	if(check(a,c))ans++;
	for(int i=1;i<=9;i++){
		if(!st[i]){
			st[i]=1;
			dfs_c(a,c*10+i);
			st[i]=0;
		}
	}
}
void dfs_a(int a){
	if(a>=n)return ;
	if(a)dfs_c(a,0);
	for(int i=1;i<=9;i++){
		if(!st[i]){
			st[i]=1;
			dfs_a(a*10+i);
			st[i]=0;
		}
	}
}
int main(){
	cin>>n;
	dfs_a(0);
	cout<<ans<<endl;	
	return 0;
}
                
                
                
        
    
转载请注明原文地址:https://blackberry.8miu.com/read-742.html