这里给出E的题解。

更好的阅读体验:https://www.cnblogs.com/BTeqwq/p/ncb36-e.html

出题人一定是车万人(


考虑有 xxR ,yyP

很明显你对于一个 R,他后面如果多出来 kkP ,那么 RP 就会多 kk 个。

然后反过来,如过它前面多出来 kkP ,那么 PR 就会多 kk 个。

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

这个 R 左边如果有 qqP ,那么有右边就有 yqy-qP

所以它会贡献 qqPRyqy-qRP

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

很明显 PRRP 一共就有 i=1xq+(yq)=x×y\sum\limits_{i=1}^x q+(y-q)=x\times y 个。

所以 n+m=x×yn+m=x\times y

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

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

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

现在考虑构造可行解。

考虑把 yyP 放在最后,那么我们在前面放上一个 R ,那么很明显就会多出来 yyRP

所以一直在前面放 R ,直到 RP的个数大于 nn

因为它要求你恰好有 nn 个,所以我们把前面的一个 R 放到 yyP 当中的某个位置让 RP 恰好有 nn 个。

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

现在你已经构造完所有的 RP 了,那么根据 n+m=x×yn+m = x\times y 这个式子,你在后面放上剩下的所有 R ,那么一定能构造出 mmPR

本题就做完了。

#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;
}