[Codeforces Round #657 (Div. 2)] B. Dubious Cyrpto 构造

题目链接:B. Dubious Cyrpto
题意

给你一个等式 n ∗ a + b − c = m ( l ≤ a , b , c ≤ r , 1 ≤ m ≤ 1 0 10 , 1 ≤ l ≤ r ≤ 500000 ) { n*a+b-c=m (l≤ a,b,c ≤r ,1≤m≤10^{10} ,1≤l≤r≤500000)} na+bc=m(la,b,cr1m10101lr500000),其中n,a,b,c,l,r,m都为正整数,输入l,r,m,求a,b,c的值。

题解

以开始以为是二分,后来发现是构造。
易 知 : m = ⌊ m a ⌋ ∗ a + m % a {易知:m=\lfloor \frac{m}{a} \rfloor*a+m\%a} m=ama+m%a
可以将 n = ⌊ m a ⌋ , b = l + m % a , c = l {n=\lfloor \frac{m}{a} \rfloor,b=l+m\%a,c=l} n=am,b=l+m%a,c=l,由于题目要求n≥1并且 l ≤ a , b , c ≤ r {l≤ a,b,c ≤r} la,b,cr,所以需要加入判断条件: ⌊ m a ⌋ ≥ 1 且 b ≤ r {\lfloor \frac{m}{a} \rfloor≥1 且 b≤r} am1br
如果 ⌊ m a ⌋ < 1 {\lfloor \frac{m}{a} \rfloor<1} am<1,我们可以在前面加上一个a,后面减去一个a。
m = ( ⌊ m a ⌋ + 1 ) ∗ a + m % a − a {m=(\lfloor \frac{m}{a} \rfloor+1)*a+m\%a-a} m=(am+1)a+m%aa
那么我们可以构造 n = ⌊ m a ⌋ + 1 , b = r + m % a − a , c = r {n=\lfloor \frac{m}{a} \rfloor+1,b=r+m\%a-a,c=r} n=am+1,b=r+m%aa,c=r,
然后判断b是否符合条件,符合输出不符合继续遍历a。

代码
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		ll l,r,m;
		cin >> l >> r >> m;
		for(ll a=l;a<=r;a++)
		{
			ll n=m/a;
			ll x=m%a;

			if(n>=1 && x<=r-l)
			{
				cout << a << ' ' << l+x << ' ' << l << endl;
				break;
			}
			x-=a;
			if((r+x)>=l && (r+x)<=r)
			{
				cout << a << ' ' << r+x << ' ' << r << endl;
				break;
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值