B. Dubious Cyrpto(思维+枚举)

题目
在这里插入图片描述
大致翻译:帕夏喜欢把严格的正整数送给他的朋友。帕夏关心安全性,因此当他想发送一个整数n时,他用以下方式对它进行加密:他选取三个整数a、b和c,使l≤a、b、c≤r,然后计算加密值m=n⋅a+b−c。
不幸的是,一个对手截获了l、r和m的值。有可能从这些信息中恢复a、b和c的原始值吗?更正式地说,你需要找到a,b和c的任何值
a、 b和c是整数,
l≤a,b,c≤r,
存在一个严格的正整数n,使得n⋅a+b−c=m。
输入
第一行包含唯一的整数t(1≤t≤20)-测试用例数。下面的t行分别描述一个测试用例。
每个测试用例由三个整数l、r和m组成(1≤l≤r≤500000,1≤m≤1010)。这些数字说明问题的答案是存在的。

输出
对于每个测试用例,输出三个整数a、b和c,使得l≤a、b、c≤r,并且存在一个严格正整数n,使得n⋅a+b−c=m。保证至少有一个可能的解,并且如果有多个解,您可以输出任何可能的组合。
例子
输入
2
4 6 13
2 3 1
输出
4 6 5
2 2 3
注意
在第一个例子中,n=3是可能的,然后n⋅4+6−5=13=m。其他可能的解决方案包括:a=4,b=5,c=4(当n=3时);a=5,b=4,c=6(当n=3时);a=6,b=6,c=5(当n=2时);a=6,b=5,c=4(当n=2时)。
在第二个例子中,唯一可能的情况是n=1:在这种情况下n⋅2+2−3=1=m。注意,n=0是不可能的,因为在这种情况下n不是严格的正整数。
思路:在l到r的范围枚举a,(b-c)存在两种情况 1.b-c>=0,则b>=c。此时有两种思路,第一:从l入手,c=l,b=l+m%a,若b<=r则符合题意,成立;第二:从r入手,b=r,c=r-m%a,若c>=l则符合题意,成立;
2.b-c<0,则b<c.同样也有两种思路,第一:从l入手,b=l,c=l+a-m%a,若c<=r则成立;第二:从r入手,b=r-a+m%a,c=r,若b>=l则成立;(重点 因为在高中数学上很少运用余数求值运算所以要好好理解一下,注意思维的转换)
思路一:

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-6
typedef long long ll;

int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		ll l,r,m,a,b,c;
		scanf("%lld%lld%lld",&l,&r,&m);
		for(ll i=l;i<=r;i++){
			ll p=m%i;
			if(m>=i&&l+p<=r){
				a=i,b=l+p,c=l;
				break;
			}
			if((l+i-p)<=r){
				a=i,b=l,c=l+i-p;
				break;
			}
		}
		printf("%lld %lld %lld\n",a,b,c);
	}
    return 0;
}

思路二:

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-6
typedef long long ll;

int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		ll l,r,m,a,b,c;
		scanf("%lld%lld%lld",&l,&r,&m);
		for(ll i=l;i<=r;i++){
			ll p=m%i;
			if(m>=i&&r-p>=l){
				a=i,b=r,c=r-p;
				break;
			}
			if(r-i+p>=l){
				a=i,b=r-i+p,c=r;
				break;
			}
		}
		printf("%lld %lld %lld\n",a,b,c);
	}
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值