https://www.lanqiao.cn/problems/213/learning/
数论方法:
题目说给定两个数,问这两个数不能凑出来的最大的数是什么?
有两个数学结论:
1.当两个数不是互质的,它们两有凑不出来的数,但是这个是没有最大值。比如2和2,199凑不出来,1999也凑不出来
2.当两个数互质,它们两凑不出来的最大的数是ab - a - b
因此代码:
#include <iostream>
using namespace std;
int main()
{
int a , b;
cin >> a >> b;
cout << a * b - a - b;
return 0;
}
dp方法
这道题和跳石板有点像,都是可不可以到达一个点的问题,因此可以用dp
跳石板链接
初始值为x,每次只能走n步或者m步。那么离x 走一步 能走到的点就是x + n或者x + m。在(x, min(x + n, x + m))
和
(min(x + n, x + m), max(x +n, x + m))
之间所有点都是走不到的。
因此下面递推式可以把所有能到达的点都凑出来
if(f[i] == 1) f[i + n] = f[i + m] = 1
在遍历所有点的过程中,记录f[i] != 1
的点,并不断更新成最大的,就是不可到达的最远的点。
ac代码:
#include <iostream>
using namespace std;
const int N = 1000010;
int f[N];
int main()
{
int n, m, ans;
cin >> n >> m;
int i = min(n, m);
f[n] = f[m] = 1;
for(; i < n * m; i++)
{
if(f[i] == 1) f[i + n] = f[i + m] = 1;
else ans = i;
}
cout << ans;
}