问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
从标准输入读入一个正整数N (N<1000*1000)
输出格式
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6
【搜索+剪枝】
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 6 int a[10],vis[10],ans; 7 int const n=9; 8 9 __int64 num,num1,num2,num3; 10 11 __int64 solve(int i,int j) // 从 a数组的第i位到第j位 12 { 13 __int64 temp=0; 14 for(int k=i;k<=j;k++) 15 temp=temp*10+a[k]; 16 return temp; 17 } 18 19 void count1()// 该排列 按顺序分为 num1 num2 num3三部分 结果能不能组合成num 20 { 21 int l=1; 22 __int64 temp; 23 temp=num; 24 while(temp=(temp/10)) 25 l++;// num1 的长度 26 for(int i=0;i<l;i++) 27 { 28 num1=solve(0,i); 29 if(num1>num) 30 return ; 31 for(int j=(n-i)/2;j<=n-(i+1);j++) 32 { 33 num2=solve(i+1,i+j); 34 num3=solve(i+j+1,n-1); 35 //printf("%I64d %I64d %I64d\n",num1,num2,num3); 36 if(num3!=0&&num2>num3&&num2%num3==0&&num==num1+num2/num3) 37 ans++; 38 39 } 40 41 } 42 43 44 } 45 46 void dfs(int start,int n) 47 { 48 if(start==n) 49 count1(); 50 for(int i=1;i<=9;i++) 51 { 52 if(vis[i]) 53 continue; 54 a[start]=i; 55 vis[i]=1; 56 dfs(start+1,n); 57 vis[i]=0; 58 } 59 } 60 61 62 int main() 63 { 64 while(scanf("%I64d",&num)!=EOF) 65 { 66 memset(vis,0,sizeof(vis)); 67 ans=0; 68 dfs(0,n); 69 printf("%d\n",ans); 70 } 71 return 0; 72 }