已知方程为ax+by=c,现给出a,b,求max(c)对方程x,y无自然数解
数据保证c有最大值
题目保证了c没有上界,所以gcd(a,b)=1互质
根据数学结论,max(c)=a*b-a-b
证明:二元一次不定方程ax+by=N,gcd(a,b)=1,a>1,b>1
当N>ab-a-b时有非负整数解,N=ab-a-b时则不然。
首先 N为整数
gcd(a,b)=1,方程有整数解,
设其解为:
x=x0+bt,y=y0-at (t为整数)
取适当的t,使得0<=x<=b-1(只需在x0上加上或减去若干个b)
则当N>ab-a-b时有:
by=N-ax>ab-a-b-ax>=ab-a-b-a(b-1)=-b
所以,y>-1,故y>=0即为非负整数
当N=ab-a-b时若存在解(x,y),则
ax+by=ab-a-b,即ab=a(x+1)+b(y+1)
又(a,b)=1
所以a|(y+1),b|(x+1) 则a<=y+1,b<=x+1
所以 ab=a(x+1)+b(y+1)>=ab+ab=2ab矛盾
证毕。
以上全都不要,不会数论,脑子瓦特
好,暴力check小于a*b的所有数!
上代码(包含正解在注释):
1 #include <cstdio> 2 bool ok(int a,int b,int c){ 3 for(int ax=0;ax<=c;ax+=a) 4 if((c-ax)%b==0)return true; 5 return false; 6 } 7 8 int main(){ 9 int a,b; 10 scanf("%d%d",&a,&b);//printf("%d ",a*b-a-b);return 0; 11 for(int ans=a*b;;ans--) 12 if(!ok(a,b,ans)){ 13 printf("%d ",ans); 14 return 0; 15 } 16 }