0%

蓝桥杯PREV08-买不到的数目

题目链接

题目概述

输入两个数 a、b,对于任意自然数 x、y,ax+by 所表示不出的最大整数是多少。

题目分析

看到大佬的文章,有如下结论:

a,b为质数,x,y为非负整数,则ax+by最大不能表示的数为ab-a-b。

但题目中似乎没说 a、b为质数,那就用动归吧。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
using namespace std;

const int MAXN=1e7+5;
bool dp[MAXN]={0};
int a,b,ans;

int main(){
cin>>a>>b;
dp[0]=dp[a]=dp[b]=true;

for(int i = 0; i < maxn - a - b; ++i) {
if(dp[i])
dp[i + a] = dp[i + b] = true;
else
ans = i;
}
cout<<ans<<endl;
return 0;
}

自我总结

一开始我是用这样的迭代来动归的:

1
2
3
4
5
6
for(int i=max(a,b); i<MAXN-a-b; i++){
if(!dp[i])
dp[i]=(dp[i-a]||dp[i-b]);
if(!dp[i])
m=i;
}

这么写虽然能过,但是有问题的,如果 2a < b,那么会漏掉 [a, b] 之间能表示的数,所以还是应该像完整代码中那样顺推。