ZCMU-1842-带分数

来源:互联网 发布:维也纳工业大学 知乎 编辑:程序博客网 时间:2024/04/29 04:25

1842: 带分数

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 8  Solved: 2
[Submit][Status][Web Board]

Description

100  可以表示为带分数的形式:100  =  3  +  69258  /  714。 还可以表示为:100  =  82  +  3546  /  197。 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。 类似这样的带分数,100有 11  种表示法。

Input

  从标准输入读入一个正整数N (N< 1000*1000)

Output

 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。 注意:不要求输出每个表示,只统计有多少表示法!

Sample Input

100
105

Sample Output

11
6

【解析】
这道题其实刚开始想的时候真的没什么思路..不过好像可以进行全排列的来,这个形式就是整数+分数,而分数是可以
整除的,所以我们在全排列的时候安排前面的整数最大是7位数,因为后面最少最少也需要1位除1位,而被除数最少肯
定也需要一位。所以j的范围是的7,i的范围是到1.这样我们做个预处理之后直接查询就可以了。
#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int b[1000100];int main(){    int a[9]={1,2,3,4,5,6,7,8,9};    int i,j,k,n,m,p,sum;    do//每次排列都做一次    {       for(i=0;i<=6;i++)//表示i最大可以到7位       {           for(j=i+1;j<=7;j++)//j最大是7-i-1           {               n=0;               m=0;               p=0;               for(k=0;k<=i;k++)               {                   n=n*10+a[k];               }               for(k=i+1;k<=j;k++)               {                   m=m*10+a[k];               }               for(k=j+1;k<=8;k++)               {                   p=p*10+a[k];               }               if(m%p==0)//表示如果后面的分数可以整除               {                   sum=n+m/p;                   if(sum<1000000)//因为数据范围就是在1000*1000当中                   b[sum]++;               }           }       }    } while(next_permutation(a,a+9));    scanf("%d",&n);    printf("%d\n",b[n]);    return 0;}

0 0