蓝桥杯 买不到的数目【数论】

    科技2025-09-09  84

    题目链接: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; }
    Processed: 0.009, SQL: 8