蓝桥杯 带分数【DFS】【枚举】

    科技2026-01-31  8

    题目链接:AcWing 1209. 带分数

    100 可以表示为带分数的形式:100=3+69258/714

    还可以表示为:100=82+3546/197

    注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。

    类似这样的带分数,100有 11种表示法。

    输入格式 一个正整数。

    输出格式 输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。

    数据范围 1≤N<106

    输入样例1: 100

    输出样例1: 11

    输入样例2: 105

    输出样例2: 6

    程序说明:

    先求出1~9的全排列,然后划分成三段(隔板法),判断每段是否满足要求。

    代码如下:

    #include <iostream> using namespace std; int a[10], st[10], n, res; int cal(int l, int r) { int t = 0; for(int i = l; i <= r; i++) t = t * 10 + a[i]; return t; } void dfs(int k) { if(k == 9) { for(int i = 0; i < 7; i++) { for(int j = i + 1; j < 8; j++) { int a = cal(0, i); int b = cal(i + 1, j); int c = cal(j + 1, 8); if(c * n == c * a + b) res++; } } return; } for(int i = 1; i <= 9; i++) { if(!st[i]) { st[i] = 1; a[k] = i; dfs(k + 1); st[i] = 0; } } } int main() { cin>>n; dfs(0); cout<<res; return 0; }
    Processed: 0.023, SQL: 9