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

· · 题解

主要思路

考虑枚举。枚举分解出的前两个数 i,j,为了保证不重复且各个数不相同,j 必须大于 i。剩下的一个数 k 就自动等于 N-i-j,最后判断 k 是否大于 ji,j,k 都不含 3,7,如果满足条件就将答案加 1

AC Code

#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

typedef long long ll;
typedef long double db;
const int INT_INF = 0x3f3f3f3f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
inline ll _abs(ll a) { if (a < 0) return -a; return a; }
inline ll _pow(ll a, ll b) { ll x = 1, y = a; while(b > 0) {if (b & 1) x *= y; y *= y; b >>= 1; } return x; }
// ----------------------------

// ----------------------------

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

int main() {
    int n; cin >> n;
    // ----------------------------
    int k, ans = 0;
    for (int i = 1; i < n - 1; i++) {  // j,k 都至少为 1,所以 i 从 1 枚举到 n-2
        if (!check(i)) continue;
        for (int j = i + 1; j < n - i; j++) {  // 同理,j 从 i+1 枚举到 n-i-1
            k = n - i - j;
            if (k > j && check(j) && check(k)) ans++; 
        }
    }
    // ----------------------------
    cout << ans;
    return 0;
}