这里给出E的题解。

更好的阅读体验​

出题人一定是车万人(



考虑有 \(x\) 个 ​​R​​ ,\(y\) 个 ​​P​​。

很明显你对于一个 ​​R​​,他后面如果多出来 \(k\) 个 ​​P​​ ,那么 ​​RP​​ 就会多 \(k\) 个。

然后反过来,如过它前面多出来 \(k\) 个 ​​P​​ ,那么 ​​PR​​ 就会多 \(k\) 个。

现在考虑构造完之后的字符串 \(cs\),对于它里面的任意一个 ​​R​​,

这个 ​​R​​ 左边如果有 \(q\) 个 ​​P​​ ,那么有右边就有 \(y-q\) 个 ​​P​

所以它会贡献 \(q\) 个 ​​PR​​ ,\(y-q\) 个 ​​RP​

然后对于每一个​​R​​ 都是如此,

很明显 ​​PR​​ 和​​RP​​ 一共就有 \(\sum\limits_{i=1}^x q+(y-q)=x\times y\) 个。

所以 \(n+m=x\times y\),

因为 \(n+m > 10^5\) 无解,所以尽量让构造出来的字符串长度最小。

这样子才能避免漏解,所以我们让 \(x,y\) 的差尽量小(和定差小积大),也就是让他们靠近 \(\sqrt{n+m}\)。

如果这样子构造出来的 \(x\times y >10^5\) ,那么就无解。

现在考虑构造可行解。

考虑把 \(y\) 个 ​​P​​ 放在最后,那么我们在前面放上一个 ​​R​​ ,那么很明显就会多出来 \(y\) 个 ​​RP​​。

所以一直在前面放 ​​R​​ ,直到 ​​RP​​的个数大于 \(n\) 。

因为它要求你恰好有 \(n\) 个,所以我们把前面的一个 ​​R​​ 放到 \(y\) 个 ​​P​​ 当中的某个位置让 ​​RP​​ 恰好有 \(n\) 个。

比如你现在已经构造了 \(n-q,(q<y)\) 个 ​​RP​​ ,那么你在倒数第 \(q\) 个 ​​P​​ 的前面放上一个 ​​R​​ 即可。

现在你已经构造完所有的 ​​RP​​ 了,那么根据 \(n+m = x\times y\) 这个式子,你在后面放上剩下的所有 ​​R​​ ,那么一定能构造出 \(m\) 个 ​​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;
}