试题 历届试题 买不到的数目(dp、数学)

问题描述

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

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

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

输入格式

两个正整数,表示每种包装中糖的颗数(都不多于1000)

输出格式

一个正整数,表示最大不能买到的糖数

样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7
思路
1.观察两个数为互质数,开一个dp数组,标志dp[0]=1,dp[n]=1,dp[m]=1;
从1枚举到n*m(gcd=1,相当于lcm(n,m)),当dp[i-n]=1 or dp[i-m]=1有dp[i]=1;比n*m大的数一定可以组合得到。
code:
#include<bits/stdc++.h>
using namespace std;
int dp[1000005];
int main(){
    int n,m;
    cin>>n>>m;
    dp[0]=1;dp[n]=1;dp[m]=1;
    for(int i=1;i<=n*m;i++){
        if(i>n&&dp[i-n]||i>m&&dp[i-m]){
            dp[i]=1;
        }
    }
    for(int i=n*m;i>=1;i--){
        if(!dp[i]){
            cout<<i<<endl;
            break;
        }
    }
    return 0;
}

2.数论结论,扩展欧几里得自然数a,b互质,则不能表示成ax+by(x,y为非负整数)的最大整数是ab-a-b. 

简单证明用反证法,假设ax+by=ab-a-b,有ab=an+bm;

ab是a的倍数,an是a的倍数,则bm需是a的倍数,只能是m是a的倍数;bm=bm'a>=ab,又a>1,b>1,矛盾。

posted @ 2020-08-03 10:55  mohari  阅读(138)  评论(0编辑  收藏  举报