#include<iostream> #include<cstdio> #include<algorithm> usingnamespacestd; constint N = 30; int n,m; int way[N]; voiddfs(int u,int start) { // 当前进行dfs(u...),已经选u-1个数,剩下n-strat+1个数可选 // u-1 + n-strat+1 < m,把后面所有的数都选上,加起来也不够m,直接退出 if (u + n - start < m) return;// 递归搜索的剪枝优化,快了近三倍 if (u == m + 1) { for (int i = 1;i <= m;i ++) printf("%d ",way[i]); puts(""); return; } for (int i = start;i <= n;i ++) { way[u] = i;// 第u层选择数字i dfs(u+1,i+1);// 第u层从数字i+1开始选择
boolcheck(int a, int c) { longlong b = n * (longlong)c - a * c;
if (!a || !b || !c) returnfalse;
memcpy(backup, st, sizeof st);// 将st数组复制到backup while (b) { int x = b % 10; // 取个位 b /= 10; // 个位删掉 if (!x || backup[x]) returnfalse; backup[x] = true; }
for (int i = 1; i <= 9; i ++ ) if (!backup[i]) returnfalse;
returntrue; }
voiddfs_c(int u, int a, int c) { if (u > 9) return;
if (check(a, c)) ans ++ ;
for (int i = 1; i <= 9; i ++ ) if (!st[i]) { st[i] = true; dfs_c(u + 1, a, c * 10 + i); st[i] = false; } }
voiddfs_a(int u, int a) { if (a >= n) return; if (a) dfs_c(u, a, 0);// 对于每一个a,再对c进行枚举
for (int i = 1; i <= 9; i ++ ) if (!st[i]) { st[i] = true; dfs_a(u + 1, a * 10 + i); st[i] = false; } }
int target; //题目给出的目标数 int num[N]; //保存全排列的结果 bool used[N]; //生成全排列过程中标记是否使用过 int cnt; //计数,最后输出的结果
//计算num数组中一段的数是多少 //因为c*n == a*c+b有概率会爆int 保险起见longlong intcalc(int l, int r){//l是num[l]之前,r是num[r]之后 int res = 0; for(int i = l; i <= r; i++) res = res * 10 + num[i]; return res; }
voiddfs(int u){ //当全排列生成后进行分段 //用两层循环分成三段 if(u == 9){ for(int i = 0; i < 7; i++)// 枚举分隔点1 for(int j = i + 1; j < 8; j++){// 枚举分隔点2 if(j-i+1<9-j)continue; // 剪枝优化1,b的位数一定>=c的位数 // 位数,a:i + 1; b:j - i; c:8-j int a = calc(0, i); if (a >= target) continue; // 剪枝优化2,参考自别人 int b = calc(i + 1, j); int c = calc(j + 1, 8); //注意判断条件,因为C++中除法是整除,所以要转化为加减乘来计算 if(a * c + b == c * target) cnt++;// 小心爆int }
intcalc(int a,int b){ int num = 0; for (int i = a;i <= b;i++) num = 10*num + st[i]; return num; }
voiddfs(int u){ if (u > 9){ for (int i = 1;i <= 7;i++) for (int j = i+1;j <= 8;j++){ if (j-i < 9-j) continue; int a = calc(1,i); if (a >= t) continue; int b = calc(i+1,j); int c = calc(j+1,9); if (c*t == a*c + b) cnt++; } return; } for (int i = 1;i <= 9;i++){ if (!used[i]){ st[u] = i; used[i] = true; dfs(u+1); used[i] = false; } } }