7-5 整除阶乘 (15分)
本题要求你在给定区间 [a,b] 内找出使得 n^2 +1 整除 n! 的所有正整数 n。
输入格式:
输入在一行中给出两个正整数 0<a<b≤10^4 ,其中 (b−a)≤20。
输出格式:
按照递增顺序,每行输出一个满足题面条件的 n。如果解不存在,则输出 None。
输入样例 1:
30 50
输出样例 1:
38
43
47
输入样例 2:
50 55
输出样例 2:
None
在这里插入代码片
7-6 百腾密码破译 (20分)
谷歌曾经在硅谷的101号公路边竖立了一块巨大的广告牌用于招聘,内容是一道谜题,能破解谜题的人,就可以通过谜题的解访问谷歌的网站进入招聘流程的下一步。
百腾也打算模仿这个做法发布一个招聘网站,这个网站的访问密码就是一道谜题的解。访问网站的正确密码具有以下特殊的规律:
密码是一个形如 s…sXs…sYs…s 的字符串,其中 X 和 Y 可以是任何不等于 ? 的可见字符,s 可以是任何英文字母,并且不能跟 X 和 Y 相同;
任何形如 aXsYa 的字符串都是合法的密码,其中 a 是由若干个 s 组成的非空字符串。例如 ccccBcTcccc 就是一个合法的密码;
如果已知 aXbYc 是合法的密码,则规定 aXsbYca 也是合法的密码,其中 a、 b、 c 均是仅由字母 s 组成的非空字符串。例如根据 1 已知 uuBuTuu 是一个合法的密码,则根据 2 推出 uuBuuTuuuu 也是合法的密码;
每个应聘者会在登录界面看到一个部分密码的提示,给出了形如 aXbYc 的字符串的一部分,其中 a、 b、 c 均是仅由字母 s 组成的非空字符串,它们中间的一个串由 ? 代替。例如 uuBuuT? 就是一个提示。你必须根据提示给出完整的密码。
输入格式:
输入在一行中给出一个长度不超过 20 的密码提示。
输出格式:
在一行中输出完整的密码。题目保证解是存在的。
输入样例 1:
uuBuuT?
输出样例 1:
uuBuuTuuuu
输入样例 2:
zzS?Tzzzzzz
输出样例 2:
zzSzzzTzzzzzz
输入样例 3:
?%o&ooo
输出样例 3:
ooo%o&ooo
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int main(){
ios::sync_with_stdio(false);
string s="";
while(cin>>s){
int len=s.length();
string a="",b="",c="";
int f=0;
int k=2;
int p=0;
if(s[len-1]=='?'){
k=0;
for(int i=0;i<len-2;i++){
if(i==k||s[i-1]==s[i]){
if(f==0){
a+=s[i];
}
else{
b+=s[i];
}
}
else{
f++;
k=i+1;
}
}
for(int i=0;i<len-1;i++) cout<<s[i];
p=b.length();
for(int i=0;i<p;i++) cout<<a;
cout<<endl;
}
else if(s[0]=='?'){
k=2;
for(int i=2;i<len;i++){
if(i==k||s[i-1]==s[i]){
if(f==0){
b+=s[i];
}
else{
c+=s[i];
}
}
else{
f++;
k=i+1;
}
}
p=c.length()/b.length();
for(int i=0;i<p;i++) cout<<s[len-1];
for(int i=1;i<len;i++) cout<<s[i];
cout<<endl;
}
else {
k=0;
for(int i=0;i<len;i++){
if(i==k||s[i-1]==s[i]){
a+=s[i];
}
else{
break;
}
}
k=len-1;
for(int i=len-1;i>=0;i--){
if(i==k||s[i+1]==s[i]){
c+=s[i];
}
else{
break;
}
}
cout<<a;
cout<<s[a.length()];
p=c.length()/a.length();
for(int i=0;i<p;i++) cout<<s[0];
cout<<s[a.length()+2];
cout<<c;
cout<<endl;
}
}
return 0;
}
/*
?BuuTuuuu
uuTuuuuB?
uuBuuT?
zzS?Tzzzzzz
?%o&ooo
?%oo&oooo
*/
7-8 完美对称 (25分)
如果一段完美对称的数据曲线被截断了,你能把被砍掉的部分补回来吗?
例如上图中黑点部分是被截断后剩余的原始数据点,红点是被砍掉的点。你的任务就是根据左边给定的黑点算出右边那些红点。输入格式:输入首先在第一行给出一个正整数 N (≤104),为给定的黑点数量。第二行给出 N 个黑点的整数 y 坐标。这里假设数据点的 x 坐标都是等距分布的,并且黑点按其 x 坐标的递增序给出。所有给出的数据都在 [−231,231] 内,一行中的数据以空格分隔。输出格式:找出黑点右侧需要填补的最短的红点序列,在一行中按其 x 坐标的递增序给出其 y 坐标。但如果输入的黑点序列已经是完美对称的了,则输出整个序列。数字间必须以 1 个空格分隔,行首尾不得有多余空格。
输入样例 1:
12
9 8 7 6 5 4 3 2 1 2 3 4
输出样例 1:
5 6 7 8 9
输入样例 2:
6
1 -2 3 3 -2 1
输出样例 2:
1 -2 3 3 -2 1
在这里插入代码片