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
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Dubious Cyrpto | GNU C++17 | Accepted | 78 ms | 3900 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;
}