假设n和m分别为 4 和 7
其实我们可以观察到,如果4和7能凑出某个数,无非三种情况:
1、单纯用4
2、单纯用7
3、4和7同时用
这里的话呢其实我们只需要对第三个情况进行具体操作就行,因为其他两个条件比较简单
对于第三种情况,如果一个数可以由 4 和 7 组成的话,那么我们可以做如下操作:
假如一个数由 x 个4和 y 个 7 组成,那么我们可以对其一直减去 4 ,直到我们减去后的结果能够整除 7 为止
当然了这期间要保证其大于0
也就是:
while((k-4)%7!=0&&k>0)k-=4;
到最后,我们再来判断一下这个数能否整除7就行了,如果不能,那就说明这个数无法被 x 个 4 和 y 个 7 组成。
当然了我们对于 1 和 2 两个条件还是要判断一下的,具体实现代码如下,应该算比较简洁了吧
#include<iostream>
using namespace std;
int n,m;
int main()
{
scanf("%d%d",&n,&m);
int k=n*m;
while(k)
{
int t=k;
while(t%m!=0&&t-n>0)t-=n;
if(t%m!=0&&k%n!=0&&k%m!=0)//这一步就是判断了1、2、3 三个条件
{
printf("%d",k);
break;
}
k--;
}
return 0;
}
为什么输出k而不是t
#include[HTML_REMOVED]
using namespace std;
int n,m;
int main()
{
scanf(“%d%d”,&n,&m);
}
这样写可以吗
为什么可以确定最大的小于m*n?
这里的话呢有一个性质哦,首先题中给出的两个数必须互质(因为这样才有解),其次解就是(n-1)(m-1)-1,而(n-1)(m-1)-1=mn-m-n-1<mn。具体的证明这里有哦:Light的博客
谢谢
如果都知道解是(n-1)(m-1)-1,那不就直接ac了嘛,那这些代码?
我也奇怪,试了一下,用(n-1)(m-1)-1当作解真的ac了
哈哈哈哈 因为这是数学知识直接推出来的结论呀
哦哦 明白了break 但是k=n*m是咋来滴呀
k=mn 的话是它的一个范围,因为数据保证有解,有解的话解必然在mn这个范围内
请问一下为什么在这个范围里面呢
没错,y总的dfs意思就是 m 肯定是由p 或 q 或三个组合而成的 , 所以dfs对m减去p,或者q 能减到0就说明成功,返回true。 所以m 起码要大于等于p 或 q , 不然减到负数了,大佬nb
nb
太厉害了!!!
牛逼
思路很清晰 太强了
orz
感谢大佬,大佬好厉害
厉害了,我懂了,大佬呀!!
nb
大佬!!!简单易懂
if条件看不懂
我琢磨了一早上,我觉得是这样的,一直减4,直到结果可以整除7的那个while循环下的那个t是在不满足t>n这个条件下退出while循环的,就好比例子里的答案17是在t为1的时候退出while,执行下一个if判断的,
此时t%m就不等于0,即t对应的这个k也就不能被m和n表示出来,
if的其他两个小条件就是判断k能不能被m和n分别表示的。
我详细注释了一下佬的思路:
为啥k的最大为n*m嘞。。。
解必然在n*m的范围内
为什么呢
为什么呢
为什么呢
为啥要加break
一旦if条件满足,那么就相当于找到了这个最大的数了,当然要结束循环了