题目链接: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=m(l≤a,b,c≤r,1≤m≤1010,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}
易知:m=⌊am⌋∗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=⌊am⌋,b=l+m%a,c=l,由于题目要求n≥1并且
l
≤
a
,
b
,
c
≤
r
{l≤ a,b,c ≤r}
l≤a,b,c≤r,所以需要加入判断条件:
⌊
m
a
⌋
≥
1
且
b
≤
r
{\lfloor \frac{m}{a} \rfloor≥1 且 b≤r}
⌊am⌋≥1且b≤r
如果
⌊
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%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}
n=⌊am⌋+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;
}
}
}
}