2013寒假练习 1051 Score

地址:http://acm.bit.edu.cn/mod/programming/view.php?a=537

题意其实就是:给出a,b 问不能使得ax+by=n有正整数解的最大n。如a=3 b=7,n>11时恒有正整数解,n=11时没有,故答案为11;a=2,b=2,n为奇数时均无正整数解,故不存在“最大的”,输出Inf。

一眼就能看出若a,b不互素那么Inf。关键是a,b互素时,这个最大的n是多少。
这里要用到一条引理:若a,b互素,则b乘以a的剩余类是a的剩余类的一个置换。换句话说:
对于m=0,1,2...a-1。b*m除以a的余数取遍0,1,2...a-1,仅有可能是顺序不同。再换一句话说:
b*m%a(m=0,1,2...a-1)是一种没有冲突的哈希函数

如a=3,b=7

7*0 mod 3 = 0

7*1 mod 3 = 1

7*2 mod 3 = 2

 

那么对于 n>=b*(a-1) (这个例子里是n>=7*2) 我们都能在上面找到和n模a同余的b*m,即n=b*m(mod a) 使得 n-b*m=0 (mod a) 且n-b*m>0 则有n=b*m+a*k(m,k>=0) 即此时原方程一定有正整数解。

那么小于b*(a-1)的n呢?

对于b*(a-1)-a<n<b*(a-1) (这个例子里是 7*2-3<n<7*2)它们与 b*(a-1) 模a不同余,故从上面仍然能找到比它们小的b*m。如13mod 3余 1,那么仍能找到7*1 mod 3余 1.

但 n=b*(a-1)-a就不行了,如这个例子里的n=11,11 mod 3 =2 ,要减去 7*2 mod 3=2 但 7*2超过11了。

故最大的n就是b*(a-1)-a即a*b-a-b.

http://acm.bit.edu.cn/mod/forum/discuss.php?d=293

#include<iostream>
using namespace std;
int x,y;
int gcd(int a,int b)
{
	if(b==0) return a;
	return gcd(b,a%b);
}
int main()
{
	int a,b;
	while(scanf("%d%d",&a,&b),a||b)
	{
		if(gcd(a,b)!=1) printf("Inf\n");
		else printf("%lld\n",(long long)a*b-a-b);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值