P12335 真真随机题解
P12335 真真随机
题目背景
摇曳轻落。
这又何尝不是一种造计算机?
题目描述
你并不会伪伪随机,所以你要做一道简单题。
#include <bits/stdc++.h>
using namespace std;
int n;
unsigned int a[6],b[6];
char s[207];
signed main(){
scanf("%s",s+1);
n=strlen(s+1);
a[1]=1;
for(int _=1;_<=n;_++){
char ch=s[_];
for(int i=1;i<=5;i++) b[i]=0;
if(ch=='L'){
b[2]+=a[1];
b[2]+=a[3];
b[4]+=a[5];
b[2]+=a[4];
b[4]+=a[2];
}
if(ch=='R'){
b[1]+=a[2];
b[3]+=a[1];
b[3]+=a[5];
b[4]+=a[2];
b[4]+=a[3];
b[5]+=a[2];
b[5]+=a[4];
}
for(int i=1;i<=5;i++) a[i]=b[i];
}
printf("%u\n",a[1]);
return 0;
}
如上是小 D 设计的,准备和你交互的程序。
因为小 D 不会配置交互题,所以请你构造一种输入使得该程序的输出恰好为 n n n。
输入格式
输入一行,一个整数 n n n。
输出格式
输出一行,一个字符串,表示提供给小 D 的输入。
请保证此字符串非空,否则可能出现意料之外的结果。
此字符串长度不能超过 200 200 200,否则无法通过对应测试点。
你只需要输出任意一种满足条件的字符串即可获得分数。
如果无法表示出某个数,请仅输出一行 -1。
输入输出样例 #1
输入 #1
3
输出 #1
RLRLLLRLLLLR
输入输出样例 #2
输入 #2
3
输出 #2
LLRLLRLLRLLR
输入输出样例 #3
输入 #3
11776
输出 #3
RLRLRLLLRLRRLRLRLRLRLRLRLRLRLRLR
输入输出样例 #4
输入 #4
16
输出 #4
LRLRLRLRRLLRLR
输入输出样例 #5
输入 #5
47
输出 #5
RLRRLLRLRRLLRLRLLRRRLRRRRLR
输入输出样例 #6
输入 #6
720
输出 #6
RLRRRLRRLRLRRRLRRLLLRLLLRLRLLLR
输入输出样例 #7
输入 #7
176374
输出 #7
RRLLRRLRRLLRLLRRLLRLLRRLRLRLRRLLRLLRLLLLRLRLLRLLRLLRLLRLRLLRLR
说明/提示
样例解释
你可以直接把字符串输入进程序里。另外本题的程序不是瞎编的,具有一定实际意义,但是作为 J 组过于复杂所以无法告知你。
数据范围
本题共 20 20 20 个测试点。
对于前 20 % 20\% 20% 的数据有 n ≤ 10 n\le 10 n≤10。
对于前 40 % 40\% 40% 的数据有 n ≤ 10 5 n\le 10^5 n≤105。
对于前 60 % 60\% 60% 的数据,保证在对应范围内随机生成。
对于所有数据,保证 0 ≤ n ≤ 10 9 0 \le n\le 10^9 0≤n≤109。你的字符串可以让小 D 的程序自然溢出。
思路
构造,直接枚举细节方法即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,p,r;
int main(){
cin>>n;
if(n==0){
cout<<"L"<<endl;
return 0;
}
if(n==1){
cout<<"LR"<<endl;
return 0;
}
while(n%2==0){
n/=2;
r++;
}
for(int i=0;i<=30;i++){
if(((n>>i)&1)==1){
p=i;
}
}
n-=((1<<p)-1);
cout<<"L"<<"";
for(int i=0;i<=p-1;i++){
if(((n>>(i+1))&1)==1){
cout<<"RRLL"<<"";
}
cout<<"RL"<<"";
}
cout<<"L"<<"";
//cout<<r<<endl;
for(int i=1;i<=r;i++){
cout<<"RL"<<"";
}
cout<<"R"<<endl;
return 0;
}

浙公网安备 33010602011771号