1 条题解
-
0Guest LV 0 MOD
-
1
暴搜即可。
#include <cstdio> #include <iostream> using namespace std; bool vis[15]; int n,ans,a[105]; void dfs(int pos)// { if(pos==10)//如果 9 个数字都用完了,就可以去分类了 { int left=0;//整数部分 for(int i=1; i<=7; i++) { left=left*10+a[i];//每次加上 if(left>=n)//一旦整数就抄了,不做了,此解法不对 break; int up=0;//分子 for(int j=i+1; j<=8; j++) { up=up*10+a[j];//每次加上 int down=0;//分母 for(int k=j+1; k<=9; k++) { down=down*10+a[k];//最后的数字给分母 } if(up%down==0&&left+up/down==n)//一旦能整除且他们如题目的要求加起来是 n ans++;//那么 ans++ } } return; } for(int i=1; i<=9; i++)//暴力枚举 1~9 的排列,枚举完后再分类(整数,分子,分母),即上面的操作 { if(!vis[i])//只要没用过 { vis[i]=1;//先标记用过了 a[pos]=i;//a 数组存目前排列的方法 dfs(pos+1);//继续搜 vis[i]=0;//回溯 } } } int main() { cin>>n; dfs(1);//开始从 1 搜索 cout<<ans<<endl; return 0; }
- 1