历届试题 带分数
dfs,求出1-9的全排列。
把1-9的排列划分为num1,num2,num3,看是否满足n==num1+num2/num3。
历届试题 带分数
时间限制:1.0s 内存限制:256.0MB
问题描述
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
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int vis[20],a[20]; __int64 n; int ans=0; __int64 solve(int i,int j) { int k; __int64 sum=0; for(k=i;k<=j;k++) { sum=sum*10+a[k]; } return sum; } void cp() { __int64 num1,num2,num3; int r=0,i,j; __int64 temp=n; while(temp) { temp=temp/10; r++; } for(i=0;i<r;i++) { num1=solve(0,i); // printf("num1=%I64d\n",num1); if(num1>n) return ; for(j=i+1;j<=i+(9-i)/2;j++) { num3=solve(i+1,j); num2=solve(j+1,9-1); // printf("%I64d %I64d %I64d\n",num1,num2,num3); if(num3!=0&&num2>num3&&num2%num3==0&&n==num1+num2/num3) ans++; } } } void dfs(int cur) { int i; if(cur==9) { cp(); // for(i=0;i<cur;i++) // printf("%d",a[i]); //printf("\n"); return ; } for(i=1;i<=9;i++) { if(vis[i]==0) { a[cur]=i; vis[i]=1; dfs(cur+1); vis[i]=0; } } } int main() { memset(vis,0,sizeof(vis)); scanf("%I64d",&n); dfs(0); printf("%d\n",ans); return 0; }