P3951 小凯的疑惑(一个不好证明的数学题)

总说Markdown太难用了(真香)。


P3951 小凯的疑惑(一个不好证明的数学题)_第1张图片
    题面如图,一个数学问题,开始以为是扩展欧几里得什么的,后来发现是个结论题。
    题意:两个互质的数a,b找到最大的数c让ax+by=c没有a,b都是非负数的解。也就是用a和b无法组成c,这种问题往往可以通过打表找规律,下面是打表程序,然后针对样例假设验证。
    严谨的证明可以搜题解,要整必要性和充分性。

#include
using namespace std;
typedef long long ll;
int gcd(int x,int y){
   if(y==0) return x; return gcd(y,x%y);
}
int ou(ll a,ll b,ll &x,ll &y){
   if(b==0){
       x=1;y=0;return a;
   }
   int c=ou(b,a%b,y,x);
   y-=a/b*x;
   return c;
}
int main(){
   ios::sync_with_stdio(false);
   ll x,y;
   for(int i=1;i<=10;i++){
       for(int j=1;j<=10;j++){
           int gd=gcd(i,j);
           if(gd!=1) continue;
           ou(i,j,x,y);
           int fx=j,fy=i;
           for(int z=100;z>=0;z--){
               int xx=(x*z)%fx; //先乘 然后再取模就可以了
               xx=(xx%fx+fx)%fx;
               int yy=(z-i*xx)/j;
               if(yy>=0) continue;
               yy=(y*z)%fy;
               yy=(yy%fy+fy)%fy;
               xx=(z-yy*j)/i;
               if(xx>=0) continue;
               cout<<i<<" "<<j<<" "<<z<<endl; break;
           }
       }
   }
   return 0;
}

输出结果: 然后猜想 c=a*b-a-b
2 3 1
2 5 3
2 7 5
2 9 7
3 2 1
3 4 5
3 5 7
3 7 11
3 8 13
3 10 17
4 3 5
4 5 11
4 7 17
4 9 23
5 2 3
5 3 7
5 4 11
5 6 19
5 7 23
5 8 27
5 9 31
6 5 19
6 7 29
7 2 5
7 3 11
7 4 17
7 5 23
7 6 29
7 8 41
7 9 47
7 10 53
8 3 13
8 5 27
8 7 41
8 9 55
9 2 7
9 4 23
9 5 31
9 7 47
9 8 55
9 10 71
10 3 17
10 7 53
10 9 71

你可能感兴趣的:(acm学习之路)