• 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
    ",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 }
  • 相关阅读:
    UVA 120 Stacks of Flapjacks
    HDU 4869 Turn the pokers
    HDU 4882 ZCC Loves Codefires
    HDU 4864 Task
    HDU 4861 Couple doubi
    UVA 1600 Patrol Robot
    UVA 712 S-Trees
    2014/4/6长沙多校第六次(浙大校赛)
    UVA10905 思维考察
    HDU1498 枚举+二分图类棋盘问题(最大匹配)
  • 原文地址:https://www.cnblogs.com/JasonCow/p/12403855.html
Copyright © 2020-2023  润新知