[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)} ,其中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}
可以将 n = m a , b = l + m % a , c = l {n=\lfloor \frac{m}{a} \rfloor,b=l+m\%a,c=l} ,由于题目要求n≥1并且 l a , b , c r {l≤ a,b,c ≤r} ,所以需要加入判断条件: m a 1 b r {\lfloor \frac{m}{a} \rfloor≥1 且 b≤r}
如果 m a < 1 {\lfloor \frac{m}{a} \rfloor<1} ,我们可以在前面加上一个a,后面减去一个a。
m = ( m a + 1 ) a + m % a a {m=(\lfloor \frac{m}{a} \rfloor+1)*a+m\%a-a}
那么我们可以构造 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} ,
然后判断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;
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44235989/article/details/107666322