C++-蓝桥杯-买不到的数目[2013真题][数论/暴力]

已知方程为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\n",a*b-a-b);return 0;
11     for(int ans=a*b;;ans--)
12         if(!ok(a,b,ans)){
13             printf("%d\n",ans);
14             return 0;
15         }
16 }

 

posted @ 2020-03-03 18:27  墨鳌  阅读(320)  评论(0编辑  收藏  举报