NOIP 2017题解(更新ing)

D1T1:小凯的疑惑

题目:求一个最大的正整数c,使得ax+by=c(其中a,b为互质的两个正整数)没有非负正整数解。

正解:(想要直接数学推导的就去找数竞大佬吧。。。下面说说考试时怎么办——“一猜想+两验证”)

①打表找规律(不急,后面有严格证明


观察不为-1的所有元素可不完全归纳所求最大的c即ab-a-b。

下面是赛后打表验证的代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y) {
	if (!b) {
		x=1,y=0;
		return a;
	}
	ll d=exgcd(b,a%b,y,x);
	y-=(a/b)*x;
	return d;
}
inline bool judge(ll a,ll b,ll c) {
	ll x,y,d=exgcd(a,b,x,y);
	if (c%d) return false;
	x*=c/d,y*=c/d;
	ll tmp=b/d;
	x=(x%tmp+tmp)%tmp;
	y=(c-a*x)/b;
	return y>=0&&x>=0;
}
inline ll gcd(ll a,ll b) {
	return !b?a:gcd(b,a%b);
}
int main() {
	for (int i=1;i<=10;++i) {
		for (int j=1;j<=10;++j) {
			if (i==1||j==1||gcd(i,j)>1) {
				printf("%-3d ",-1);
				continue;
			}
			else {
				for (int t=1000;t;--t)
					if (!judge(i,j,t)&&t) {
						printf("%-3d ",t);
						break;
					}
			}
		}
		puts("");
	}
	return 0;
}
②证明c=ab-a-b原方程没有有非负正整数解:

假设有非负正整数解:

令ax+by=ab-a-b

得x=b-1-(1+y)b/a

已知a,b互质,所以a|b不成立,又因为x为正整数所以a|(1+y)

设y+1=ka(k≥1),x=b-1-kb=(1-k)b-1,因为k≥1,所以x<0,与假设矛盾。

所以假设不成立,c=ab-a-b原方程没有非负正整数解。

③证明ab-a-b是最大的c使原方程没有非负整数解:

假设它不是,设ax+by=ab-a-b+t(t为正整数)。

设t=ap+bq,其中p,q为整数(此处不要求为正)

根据exgcd算法的性质(这一点理解后面就容易了):设d=gcd(a,b),由于通解为x=x0+k*(b/d),y=y0+k*(a/d)),所以一定存在一组解(x,y)其中y>0且-b<x≤0

此处ap+bq=t(a,b互质肯定有解),令q>0且-b<p≤0。

现在观察原方程ax+by=ab-a-b+t=(b-1+p)a+(q-1)b,

因为q>0且-b<p≤0,所以b-1+p≥0且q-1≥0。

所以x=b-1+p,y=q-1即为原方程的一组非负整数解,无论t多大都成立。

证毕,下面给出正解代码(自嘲而已)。

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll a,b;
int main() {
//	freopen("math.in","r",stdin);
//	freopen("math.out","w",stdout);
	cin>>a>>b;
	cout<<a*b-a-b<<endl;
	return 0;
}


(持续更新ing)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值