AI题解5
B4283 [蓝桥杯青少年组省赛 2022] 分成整数
提交答案加入题单复制题目
提交1.15k
通过582
时间限制1.00s
内存限制512.00MB
题目编号B4283
提供者
chen_zhe
难度普及−
历史分数100
提交记录 查看题解 题目反馈
标签
蓝桥杯青少年组2022
显示算法标签
相关讨论
进入讨论版
查看讨论
推荐题目
暂无
洛谷推荐
复制 Markdown 展开 进入 IDE 模式
题目描述
给定一个正整数 N,然后将 N 分解成 3 个正整数之和,计算出共有多少种符合要求的分解方法。要求:
- 分解的 3 个正整数各不相同;
- 分解的三个正整数中各个数位都不含数字 3 和 7。
例如:N 为 8,可分解为 (1,1,6)、(1,2,5)、(1,3,4)、(2,2,4)、(2,3,3),其中满足要求的分解方法有 1 种,为 (1,2,5)。
输入格式
输入一个正整数 N(5<N<501),表示要分解的正整数。
输出格式
输出一个整数,表示共有多少种符合要求的分解方法。
输入输出样例
输入 #1复制
8
输出 #1复制
1
#include<bits/stdc++.h>
using namespace std;
bool check(int x) {while(x) {if(x%10==3||x%10==7)return false;x/=10;}return true;
}
int main() {int n,cnt=0;cin>>n;for(int i=1; i<=n; i++) {for(int j=i+1; j<=n; j++) {for(int k=j+1; k<=n; k++) {if(i+j+k==n&&check(i)&&check(j)&&check(k))cnt++;}}}cout<<cnt;return 0;
}
### 题目理解
我们需要将一个给定的正整数N分解成三个不同的正整数的和,且这三个数满足以下条件:
1. 三个数各不相同。
2. 每个数的任何数位上都不包含数字3或7。
### 解决思路
1. **生成所有可能的三元组**:首先,我们需要生成所有可能的三元组(i, j, k),使得i + j + k = N,且i < j < k(这样可以避免重复,因为顺序不重要)。
2. **检查数字的有效性**:对于每个三元组中的数字,检查它们是否不包含数字3或7。
3. **计数有效分解**:统计满足上述所有条件的三元组的数量。
### 具体步骤
1. **遍历所有可能的第一个数i**:i的范围可以从1到N-2(因为至少j和k要比i大,且j和k至少为i+1和i+2)。
2. **对于每个i,遍历可能的第二个数j**:j的范围从i+1到N-i-1(因为k至少要比j大,且k = N - i - j > j)。
3. **计算第三个数k**:k = N - i - j,必须满足k > j。
4. **检查数字的有效性**:对于i, j, k,检查它们的每一位数字是否都不是3或7。
5. **统计有效分解**:如果i, j, k都有效,则计数加1。
### 检查数字的有效性
编写一个辅助函数`is_valid(num)`,检查数字`num`的每一位是否都不包含3或7:
- 将数字转换为字符串,然后检查每一位字符是否不是'3'或'7'。
- 或者,可以逐位提取数字并检查。
### 代码实现
```python
def is_valid(num):
s = str(num)
return '3' not in s and '7' not in s
N = int(input())
count = 0
for i in range(1, N // 3 + 1): # i is the smallest, so at most N//3
for j in range(i + 1, (N - i) // 2 + 1): # j is the middle, so at most (N-i)/2
k = N - i - j
if k > j and is_valid(i) and is_valid(j) and is_valid(k):
count += 1
print(count)
```
### 代码解释
1. **is_valid函数**:检查数字是否不包含3或7。
2. **输入N**:读取要分解的正整数。
3. **初始化计数器count**:用于统计有效分解的数量。
4. **双重循环生成三元组**:
- 外层循环遍历i的可能取值(从1到大约N/3)。
- 内层循环遍历j的可能取值(从i+1到大约(N-i)/2)。
- 计算k = N - i - j,并检查k > j。
5. **检查有效性**:如果i, j, k都有效,则计数器加1。
6. **输出结果**:打印满足条件的分解数量。
### 示例验证
以输入N=8为例:
- 可能的分解:
- i=1, j=2, k=5 → 有效 (1, 2, 5)。
- i=1, j=3, k=4 → 3和4,3无效。
- 其他分解要么重复数字,要么包含无效数字。
- 输出1,与示例一致。
### 复杂度分析
- 时间复杂度:O(N²),因为有两重循环,每重循环大约N次。
- 空间复杂度:O(1),只使用了常数空间。
### 优化
- 可以通过预先生成所有有效的数字(不包含3和7的数字)来加速检查,但在这个问题中N不大(<501),直接检查即可。