Skip to main content
248 words1 min

题解:P8925 「GMOI R1-T2」Light

题意简述

原点处有一盏灯,左、右各有一面镜子,分别位于 L-LRR。两镜对照产生无穷多个像。TT 次询问,每次求左侧或右侧第 xx 个像的坐标。

解题思路

xx 高达 101010^{10},必须直接算出第 xx 个像的位置,不能逐次反射。

记左、右镜到原点的距离为 LLRR。观察左侧前几个像到原点的距离:2L, 2L+2R, 4L+2R, 4L+4R,2L,\ 2L+2R,\ 4L+2R,\ 4L+4R,\dots,每往后一个像交替增加 2R2R2L2L。于是左侧第 xx 个像到原点的距离为

2x2L+2x2R,2\left\lceil\frac x2\right\rceil L+2\left\lfloor\frac x2\right\rfloor R,

坐标取其相反数。右侧完全对称,把 LLRR 的系数互换即可。

整数实现中 x2\left\lceil\frac x2\right\rceil(x+1)/2(x+1)/2x2\left\lfloor\frac x2\right\rfloorx/2x/2。每次询问 O(1)O(1) 作答,坐标可达 101710^{17} 量级,用 6464 位整数。

时间复杂度为 O(T)O(T)

参考代码

293 Bcpp
#include <bits/stdc++.h>
using namespace std;

using ll=long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
ll l,r;
cin>>t>>l>>r;
while(t--)
{
char c;
ll x;
cin>>c>>x;
ll a=(x+1)/2,b=x/2;
cout<<(c=='L'?-2*(a*l+b*r):2*(a*r+b*l))<<'\n';
}
return 0;
}