总说Markdown太难用了(真香)。
题面如图,一个数学问题,开始以为是扩展欧几里得什么的,后来发现是个结论题。
题意:两个互质的数a,b找到最大的数c让ax+by=c没有a,b都是非负数的解。也就是用a和b无法组成c,这种问题往往可以通过打表找规律,下面是打表程序,然后针对样例假设验证。
严谨的证明可以搜题解,要整必要性和充分性。
#include<bits/stdc++.h>
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