这里给出E的题解。
更好的阅读体验:https://www.cnblogs.com/BTeqwq/p/ncb36-e.html
出题人一定是车万人(
考虑有 个 R
, 个 P
。
很明显你对于一个 R
,他后面如果多出来 个 P
,那么 RP
就会多 个。
然后反过来,如过它前面多出来 个 P
,那么 PR
就会多 个。
现在考虑构造完之后的字符串 ,对于它里面的任意一个 R
,
这个 R
左边如果有 个 P
,那么有右边就有 个 P
所以它会贡献 个 PR
, 个 RP
然后对于每一个R
都是如此,
很明显 PR
和RP
一共就有 个。
所以 ,
因为 无解,所以尽量让构造出来的字符串长度最小。
这样子才能避免漏解,所以我们让 的差尽量小(和定差小积大),也就是让他们靠近 。
如果这样子构造出来的 ,那么就无解。
现在考虑构造可行解。
考虑把 个 P
放在最后,那么我们在前面放上一个 R
,那么很明显就会多出来 个 RP
。
所以一直在前面放 R
,直到 RP
的个数大于 。
因为它要求你恰好有 个,所以我们把前面的一个 R
放到 个 P
当中的某个位置让 RP
恰好有 个。
比如你现在已经构造了 个 RP
,那么你在倒数第 个 P
的前面放上一个 R
即可。
现在你已经构造完所有的 RP
了,那么根据 这个式子,你在后面放上剩下的所有 R
,那么一定能构造出 个 PR
。
本题就做完了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int x,y;
inline bool Nosol(){ return x+y>100000; }
inline void Sol(){
int cnt=0,sum=0,r=0;
for(register int i=1;i<=x;++i){//牛客不能交register,记得去掉。
if(sum+y<=n) sum+=y,++cnt;
else{ r=n-sum;break; }
}
for(register int i=1;i<=cnt;++i){
putchar('R');
}
for(register int i=1;i<=y;++i){
if(r==y-i+1) putchar('R');
putchar('P');
}
if(cnt!=x && r==0) putchar('R');
for(int i=cnt+2;i<=x;++i){
putchar('R');
}
};
signed main(){
scanf("%lld%lld",&n,&m);
for(register int i=1;i*i<=n+m;++i){
if((m+n)%i) continue;
x=i,y=(n+m)/i;
}
if(Nosol()) return puts("-1"),0;
return Sol(),0;
}