当前位置: 代码迷 >> 综合 >> 1205. 买不到的数目【数论】
  详细解决方案

1205. 买不到的数目【数论】

热度:90   发布时间:2024-02-26 12:43:16.0

题目链接:1205. 买不到的数目

小明开了一家糖果店。

他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入格式
两个正整数 n,m,表示每种包装中糖的颗数。

输出格式
一个正整数,表示最大不能买到的糖数。

数据范围
2≤n,m≤1000,保证数据一定有解。

输入样例:
4 7

输出样例:
17

解法:

可以先暴力枚举打表,然后找规律

//暴力枚举
#include <iostream>
using namespace std;
int res, p, q;
bool dfs(int m, int p, int q) {
    if(m == 0) return true;if(m >= p && dfs(m - p, p, q)) return true;if(m >= q && dfs(m - q, p, q)) return true;return false;
}
int main() {
    cin>>p>>q;for(int i = 1; i < 1000; i++) {
    if(!dfs(i, p, q))res = i;            }cout<<res;return 0;
}

正确解答:

本题中p和q一定互质,因为根据裴蜀定理,如果p和q不互质,则一定存在整数x和y,使得xp + yq为m的倍数。

本题的结论:如果 a,b 均是正整数且互质,那么由 ax+by,x≥0,y≥0 不能凑出的最大数是 (a?1)(b?1)?1。

证明可参考:AcWing 525. 小凯的疑惑

#include <iostream>
using namespace std;
int p, q;
int main() {
    cin>>p>>q;cout<<(p - 1) * (q - 1) - 1;return 0;
}