题目

image-1667449852657

题解

  • dp做法
    关于不会大于n*m的证明:
    猜测这个不能由n,m凑出来的数应该是不会超过nm,至于证明,我是这样想的,反证法
    假设不能被凑出的最大的数大于 n·m 即:x - n · m > 0
    说明不存在任何一对a,b和d使得以下式子成立(由于x不能被凑出来所以加上一个d): x = a·n + b·m + d
    代入上式计算得到:a·n + b·m + d - m·n > 0即此式不成立,我们可以取a = m,b = n上式变为 m·n + d > 0 可以发现这是必成立的(抛去0)与假设矛盾,所以x一定不大于nm
#include<iostream>
using namespace std;
const int N=1000000;
bool f[N];
int n,m,ans;
int main(){
    cin>>n>>m;
    f[0]=true;
    int minx=min(n,m);
    int maxx=max(n,m);
    for(int i=minx;i<=n*m;i++){
        if(f[i-minx]){
            f[i]=true;
        }else if(i>=maxx&&f[i-maxx]){
            f[i]=true;
        }else {
            ans=i;
        }
    }
    cout<<ans<<endl;
    return 0;
}
  • 数论做法

打表找规律。

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