Problem: AcWing 1209. 带分数
文章目录
思路
这是一个全排列+枚举的问题。我们需要找到所有的1-9的全排列,然后在每个全排列中枚举所有可能的分数形式,检查是否满足给定的条件。
解题方法
我们首先使用深度优先搜索(DFS)来生成1-9的所有全排列。然后,对于每个全排列,我们枚举所有可能的分数形式。具体来说,我们枚举所有可能的分子和分母的位置,然后检查是否满足给定的条件。
复杂度
时间复杂度:
O ( n ! ) O(n!) O(n!),其中n是数字的数量。这是因为我们需要生成所有的全排列。
空间复杂度:
O ( n ) O(n) O(n),其中n是数字的数量。这是因为我们需要存储每个全排列。
Code
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main {
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static StreamTokenizer sr = new StreamTokenizer(in);
static int n = 9, m;
static int MAXN = 10;
static int[] arr = new int[MAXN];
static boolean[] vis = new boolean[MAXN];
static int ans = 0;
public static void main(String[] args) throws IOException {
m = nextInt();
// 全排列枚举所有情况
dfs(1);
out.println(ans);
out.flush();
}
private static void dfs(int u) {
// TODO Auto-generated method stub
if (u > n) {
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= n; i++) {
sb.append(arr[i]);
}
// 进行隔板枚举
String s = sb.toString();
for(int i = 1; i <= 7; i++) {
for(int j = i + 1; j <= 8; j++) {
int a = Integer.parseInt(s.substring(0, i));
int b = Integer.parseInt(s.substring(i, j));
int c = Integer.parseInt(s.substring(j));
if(m * c == a * c + b) {
ans++;
}
}
}
return;
}
for (int i = 1; i <= n; i++) {
if(!vis[i]) {
vis[i] = true;
arr[u] = i;
dfs(u + 1);
arr[u] = 0;
vis[i] = false;
}
}
}
static int nextInt() throws IOException {
sr.nextToken();
return (int) sr.nval;
}
}