带分数

问题描述

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 <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 const double EXP=1E-5;
 8 const int MS=11;
 9 int flag[MS],flag1[MS];
10 int ans=0;
11 int len;
12 int a;
13 int init(int x)
14 {
15     memset(flag,0,sizeof(flag));
16     flag[0]=1;
17     int ok=1;
18     int l=0;
19     while(x&&ok)
20     {
21         int r=x%10;
22         if(flag[r])
23             return 0;
24         flag[r]=1;
25         x/=10;
26         l++;
27     }
28     return l;
29 }
30 int length(int x)
31 {
32     int l=0;
33     memcpy(flag1,flag,sizeof(flag));
34     while(x)
35     {
36         int r=x%10;
37         if(flag1[r])
38             return 0;
39         flag1[r]=1;
40         x/=10;
41         l++;
42     }
43     return l;
44 }
45 
46 void dfs(int l,int x)
47 {
48     if(l<=len/2)
49     {
50         if(length(x*a)==len-l)
51             ans++;
52         for(int i=1;i<10;i++)
53         {
54             if(flag[i])
55                 continue;
56             flag[i]=1;
57             dfs(l+1,x*10+i);
58             flag[i]=0;    
59         }
60     }
61     return ;    
62 } 
63 
64 int main()
65 {
66     int n,i;
67     cin>>n;
68     for(i=1;i<n-1;i++)
69     {
70         len=init(i);
71         if(len)
72         {
73             len=9-len;
74             a=n-i;
75             dfs(0,0);
76         }
77     }
78     cout<<ans<<endl;
79     return 0;
80 }

 

posted @ 2015-02-24 07:34  daydaycode  阅读(143)  评论(0编辑  收藏  举报