# 2021 第十二届蓝桥杯大赛软件赛决赛, 国赛，C/C++ 大学B 组

612 篇文章 2 订阅

#### 概览

1：25
2：1903

//T2
#include<bits/stdc++.h>
using namespace std;
int isprime(int x){
if(x==1)return 0;
for(int i = 2; i*i <= x; i++){
if(x%i==0){
return 0;
}
}
return 1;
}
set<int>se;
int check(int x){
int t = x;
while(t){
int r = t%10;
if(!se.count(r))return 0;
t = t/10;
}
return 1;
}
int main(){
se.insert(2);
se.insert(3);
se.insert(5);
se.insert(7);
int cnt = 0;
for(int i = 1; i <= 20210605; i++){
if(isprime(i)){
if(check(i)){
cnt++;
}
}
}
cout<<cnt<<"\n";
return 0;
}


3：977

//T3
#include<bits/stdc++.h>
using namespace std;
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
int cnt = 0;
for(int y = 2001; y <= 2021; y++){
if((y%100!=0&&y%4==0)||y%400==0){
days[2] = 29;
}else{
days[2] = 28;
}
for(int m = 1; m <= 12; m++){
for(int d = 1; d <= days[m]; d++){
int s = 0;
int yy=y, mm=m,dd=d;
while(yy){s+=yy%10; yy/=10;}
while(mm){s+=mm%10; mm/=10;}
while(dd){s+=dd%10; dd/=10;}
int q = (int)sqrt(s);
if(q*q==s){
cnt++;
}
}
}
}
cout<<cnt<<"\n";
return 0;
}



4：2650578014

//T4
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define lch p<<1
#define rch p<<1|1

const int maxn = 1e4+10;
LL w[maxn], c[maxn], ok=0;
void build(int p, int l, int r){
ok++;
if(l==r){
c[p] = 1;
w[p] = 0;
return ;
}

int mid = l+r>>1;
build(lch,l,mid);
build(rch,mid+1,r);

c[p] = c[lch]+c[rch]+1;
w[p] = 1+2*w[lch]+3*w[rch]+c[lch]*c[lch]*c[rch];
}
int main(){
build(1,1,1011);
cout<<w[1]<<"\n";
cout<<ok<<"\n";
return 0;
}



T5，大小写 ，15分

//T5
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;  cin>>s;
for(int i = 0; i < s.size(); i++)
if(islower(s[i]))s[i] = toupper(s[i]);
cout<<s;
return 0;
}



T6, 123, 15分

//baoli v3
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;

LL num[maxn], ss[maxn];

LL sum(LL x){
LL xx = x;
while(xx>0){
LL t = (LL)sqrt(xx*2);
if(t*(t+1)==xx*2){
break;
}
xx--;
}

LL t = sqrt(xx*2);
LL ans = (1+x-xx)*(x-xx)/2;

ans += ss[t];
return ans;
/*
for(int i = t; i >= 1; i--){
ans += i*(t-i+1);
}
return ans;
*/
}

int main(){
for(int i = 1; i < maxn; i++){
num[i] = num[i-1]+1;
ss[i] = ss[i-1]+(1+i)*i/2;
}

int T;  cin>>T;
while(T--){
LL l, r;  cin>>l>>r;
cout<<sum(r)-sum(l-1)<<"\n";
}
return 0;
}


//baoli15
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e7+10;
LL s[maxn];
int main(){
LL now = 1, cur = 1;
for(int i = 1; i <= maxn; i++){
s[i] = s[i-1]+now;
now++;
if(now>cur){
cur = now;
now = 1;
}
}
int T;  cin>>T;
while(T--){
int l, r;  cin>>l>>r;
cout<<s[r]-s[l-1]<<"\n";
}
return 0;
}


T7，异或变换，20分

//T7
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
string c[10];
int main(){
LL n, t;  cin>>n>>t;
string a;  cin>>a;
for(int k = 1; k <= 8; k++){
string b = a;
for(int i = 1; i < n; i++){
b[i] = (a[i-1]-'0')^(a[i]-'0')+'0';
}
a = b;
//cout<<k<<": "<<b<<"\n";
c[k] = b;
}
t = t%8;
if(t==0)t = 8;
cout<<c[t]<<"\n";
return 0;
}


T8,二进制问题 , 20分

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
LL n, k;  cin>>n>>k;
int cnt = 0;
for(LL i = 1; i <= n; i++){
LL x = i, t = 0;
while(x){ t+=x&1; x>>=1;}
if(t==k)cnt++;
}
cout<<cnt<<"\n";
return 0;
}



T9,括号序列，25分

//baoli_25
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
int n, m;  cin>>n>>m;
string s;  cin>>s; s = "0"+s;
while(m--){
int op;  cin>>op;
if(op==1){
int l,r ; cin>>l>>r;
for(int i = l; i <= r; i++){
if(s[i]=='(')s[i]=')';
if(s[i]==')')s[i]='(';
}
//cout<<s<<"\n";
}else{
int l;  cin>>l;
int zuo = 0, you = 0, ans = 0;
for(int i = l; i <= n; i++){
if(s[i]=='(')zuo++;
if(s[i]==')')you++;
if(you>zuo){
break;
}
if(you==zuo){
ans = i;
}
}
cout<<ans<<"\n";
}
}
return 0;
}

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL C(LL n, LL m){
LL ans = 1;
for(LL i = m+1; i <= n; i++){
ans *= i;
}
for(LL i = n-m; i >= 1; i--){
ans /= i;
}
return ans;
}
int main(){
LL n, k;  cin>>n>>k;
LL num = 0, pos = 1, pos2 = 0, nn = n;
while(nn){
if(nn&1==1){
num++;
pos = pos2;
}
pos2++;
nn >>= 1;
}
cout<<pos<<" "<<num<<"\n";

LL ans = 0, tmp = 0;
for(int i = pos; i >= 1; i--){
if(n&(1<<(pos-1))==0){
ans += C(pos-1, k-tmp);
}else{
tmp++;
ans += C(num-tmp,k-tmp);
}
}

cout<<ans<<"\n";
return 0;
}


T10， 异或三角，25分

//baoli_ed
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e7+10;
int main(){
int T;  cin>>T;
while(T--){
LL n;  cin>>n;
LL ans = 0;
for(LL a = 1; a <= n; a++){
for(LL b = 1; b <= n; b++){
for(LL c = 1; c <= n; c++){
if(a+b>c&&b+c>a&&c+a>b){
if((a^b^c)==0)ans++;
}
if(c-b>=a)break;
}
}
}
cout<<ans<<"\n";
}
return 0;
}



【问题描述】

【答案提交】

#### 试题B: 纯质数

【问题描述】

3, 5, 7, 23, 37 都是纯质数，而11, 13, 17, 19, 29, 31 不是纯质数。当然1, 4, 35

【答案提交】

#### 试题C: 完全日期

【问题描述】

16 是一个完全平方数，它是4 的平方。所以2021 年6 月5 日是一个完全日期。

【答案提交】

#### 试题D: 最小权值

【问题描述】

W(v) = 1 + 2W(L) + 3W® + (C(L))2 C®。

【答案提交】

【问题描述】

【输入格式】

【输出格式】

【样例输入1】
LanQiao
【样例输出1】
LANQIAO
【评测用例规模与约定】

#### 试题F: 123

【问题描述】

1, 1, 2, 1, 2, 3, 1, 2, 3, 4, …

3 项是整数1 至3，接下来4 项是整数1 至4，依次类推。

【输入格式】

【输出格式】

【样例输入】
31
1
1 3
5 8
【样例输出】
148
【评测用例规模与约定】

【问题描述】

1s′
2s′
3
· · · s′
n 为：
s′
1 = s1;
s′
i = si−1 ⊕ si。

【输入格式】

【输出格式】

【样例输入】
5 3
10110
【样例输出】
11010

【评测用例规模与约定】

【问题描述】

【输入格式】

【输出格式】

【样例输入】
7 2
【样例输出】
3
【评测用例规模与约定】

#### 试题I: 翻转括号序列

【问题描述】

1. 将[Li; Ri] 区间内（序列中的第Li 个字符到第Ri 个字符）的括号全部翻
转（左括号变成右括号，右括号变成左括号）。
2. 求出以Li 为左端点时，最长的合法括号序列对应的Ri （即找出最大的
Ri 使[Li; Ri] 是一个合法括号序列）。
【输入格式】
输入的第一行包含两个整数n;m，分别表示括号序列长度和操作次数。
第二行包含给定的括号序列，括号序列中只包含左括号和右括号。
接下来m 行，每行描述一个操作。如果该行为“1 Li Ri”，表示第一种操作，
区间为[Li; Ri] ；如果该行为“2 Li” 表示第二种操作，左端点为Li。
【输出格式】
对于每个第二种操作，输出一行，表示对应的Ri。如果不存在这样的Ri，
请输出0。
【样例输入】
7 5
((())()
2 3
2 2
1 3 5
2 3
2 1
试题I: 翻转括号序列12
【样例输出】
4700
【评测用例规模与约定】
对于20% 的评测用例，n;m ≤ 5000；
对于40% 的评测用例，n;m ≤ 30000；
对于60% 的评测用例，n;m ≤ 100000；
对于所有评测用例，1 ≤ n ≤ 106, 1 ≤ m ≤ 2 × 105。
• 6
点赞
• 4
评论
• 17
收藏
• 一键三连
• 扫一扫，分享海报

06-05 1106
04-27 533
06-05 609
10-26
04-18 595
06-09 461
06-13 19
06-06 253
06-05 162

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。