题解:B4283 [蓝桥杯青少年组省赛 2022] 分成整数

· · 题解

解题思路

由于 (1, 2, 5)(2, 1, 5) 是同一种方案,那么为了在选取的过程中避免重复计算,我们可以要求选取的数必须严格单调递增,即 i < j < k

考虑暴力,枚举 i, j, k,时间复杂度 O(n^3\log n)

考虑优化,由于 i+j+k=n,那么我们可以枚举 i, j,用 n-i-j 算出 k 的大小,再判断是否合法即可,时间复杂度 O(n^2\log n)

AC_Code

#include <iostream>

using namespace std;

int n;

bool check(int x)
{
    while (x)
    {
        if (x % 10 == 3 || x % 10 == 7)
            return false;
        x /= 10;
    }

    return true;
}

int main()
{
    cin >> n;

    int res = 0;
    for (int i = 1; i <= n; ++ i )
    {
        if (!check(i))
            continue;
        for (int j = i + 1; j <= n; ++ j )
        {
            int k = n - i - j;
            if (k <= j)
                break;
            if (check(j) && check(k))
                res ++;
        }
    }

    cout << res << endl;

    return 0;
}