[codeforces 1379B] Dubious Cyrpto 公式推导

Codeforces Round #657 (Div. 2)   参与排名人数8684   错过了难得17:00比赛,可惜

[codeforces 1379B]   Dubious Cyrpto  公式推导

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1379/problem/B

ProblemLangVerdictTimeMemory
B - Dubious Cyrpto GNU C++17Accepted78 ms3900 KB

题目大意:有如下关系n*a+b-c=m,l<=a,b,c<=r,给出l,r,m,推出a,b,c.

样例模拟如下:

n*a+b-c=m可得n*a=m+c-b
l<=b<=r可得-r<=-b<=-l
l<=c<=r
可得l-r<=c-b<=r-l
继续可得m+l-r<=m+c-b<=m+r-l

4 6 13

4 6 5

m=13,l=4,r=6
13+4-6<=m+c-b<=13+6-4
即11<=m+c-b<=15

n*a=m+c-b
l<=a<=r,即4<=a<=6
a=4时,m+c-b=11时,
n=11/4=2,2*4=8<11,丢弃

a=4时,m+c-b=12时,
n=12/4=3,n*a=3*4=12,11<=12<=15,
此时12=13+c-b,可得c-b=-1.
让b=r,即b=6,可得c=5.


2 3 1

2 2 3

m=1,l=2,r=3
1+2-3<=m+c-b<=1+3-2
即0<=m+c-b<=2,因0<n*a,改进范围1<=m+c-b<=2

n*a=m+c-b
l<=a<=r,即2<=a<=3

a=2时,m+c-b=1时,
n=1/2=0,丢弃

a=2时,m+c-b=2时,
n=2/2=1,n*a=1*2=2,1<=2<=2,
此时2=1+c-b,可得c-b=1.
让b=l,即b=2,可得c=3.

根据上述样例模拟过程,编写的AC代码如下:

#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
int main(){
	int t,flag;
	LL l,r,m,a,b,c,mn,mx,i,x,y,na,delta;
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld%lld",&l,&r,&m);
		mn=max((LL)1,m+l-r);//m+1-r<=m+c-b<=m+l+r
		mx=m+l+r;
		for(a=l;a<=r;a++)//枚举a
		{
			x=mn/a,y=mx/a,flag=0;//n*a==m+c-b,n=(m+c-b)/a.x代表n的左边界,y代表n的右边界
			for(i=x;i<=y;i++){
				na=i*a;
				if(mn<=na&&na<=mx){
					delta=na-m;
					if(delta<0)b=r,c=r+delta;
					else b=l,c=l+delta;//delta>=0
					if(l<=c&&c<=r){//c落在范围内
						printf("%lld %lld %lld\n",a,b,c);
						flag=1;
						break;
					}
				}
			}
			if(flag)break;
		}
	}
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值