zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    【LOJ #2290】「THUWC 2017」随机二分图(状压DP)
    【LOJ #2136】「ZJOI2015」地震后的幻想乡(状压DP)
    【CSP-S 2019模拟】题解
    异步编程补漏
    Git(七) 查漏补缺
    ES6(二) let const
    ES6(一) 数组
    JS判断对象是否存在
    Git(六)
    Git(五)
  • 原文地址:https://www.cnblogs.com/JasonCow/p/12403855.html
Copyright © 2011-2022 走看看