2021牛客寒假算法基础集训营1

  • A. 串(线性DP)
  • B. 括号(构造)
  • E.三棱锥之刻(几何)
  • F. 对答案一时爽(签到)
  • I. 限制不互素对的排列(构造)
  • J. 一群小青蛙呱蹦呱蹦呱

A. 串(线性DP)

f[i][0]f[i][0]f[i][0] :表示字符串前i个字符中既没有’u’也没有’s’;
f[i][1]f[i][1]f[i][1] :表示字符串前i个字符中有’u’没有’s’;
f[i][2]f[i][2]f[i][2] :表示字符串前i个字符中含有’u’也有’s’;

初始化:
f[1][0]f[1][0]f[1][0] = 25; // 第1项不是’u’,那么就有25种选择
f[1][1]f[1][1]f[1][1] = 1; // 第1项是’u’,那么就只能是1种选择,就是’u’
f[1][2]f[1][2]f[1][2] = 0; // 第1项是不可能同时存在u和s,所以 f[1][2]=0f[1][2]=0f[1][2]=0

状态转移方程:
如果前i项既不含’u’也不含’s’,那么前i-1项也不会含’u’和’s’;
f[i][0]=(25×f[i−1][0])%MODf[i][0] = (25 × f[i-1][0])\% MODf[i][0]=(25×f[i−1][0])%MOD

如果前i项含有’u’不含’s’,那么有两种情况
① 第i项是’u’,那么:f[i−1][0]f[i-1][0]f[i−1][0]
② 第i项不是’u’,且要保证第i项不是’s’,那么就有25个选择:25×f[i−1][1]25 × f[i-1][1]25×f[i−1][1]
把这两种情况加起来结果

如果前i项含有’u’也含有’s’,那么也有两种情况
① 第i项是’s’,那么之前有’u’,转移方程就是:f[i−1][1]f[i-1][1]f[i−1][1]
② 第i项不是’s’,第i项有26种选择,f[i−1][2]×26f[i-1][2] × 26f[i−1][2]×26

综上:

f[i][0] = (25 * f[i - 1][0]) % MOD;
f[i][1] = (25 * f[i - 1][1] + f[i - 1][0]) % MOD;
f[i][2] = (f[i - 1][1] + f[i - 1][2] * 26) % MOD;
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1000010;
const int MOD = 1e9 + 7;
int n, ans;
int f[N][4];
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;f[1][0] = 25;f[1][1] = 1;f[1][2] = 0;for (int i = 2; i <= n; i++) {f[i][0] = (25 * f[i - 1][0]) % MOD;f[i][1] = (25 * f[i - 1][1] + f[i - 1][0]) % MOD;f[i][2] = (f[i - 1][1] + f[i - 1][2] * 26) % MOD;ans = (ans + f[i][2]) % MOD;}cout << ans << endl;return 0;
}

B. 括号(构造)

题意:
本题是一个构造题,需要构造一个形如:
a × b + c的形式
如11
11 = 3 × 3 + 2
因为右边要形成一个2,所以将 a×b+ca×b+ca×b+c 变换形式:变成 a×(b−1)+c+ba × (b - 1) + c + ba×(b−1)+c+b
这样子就能满足题意了:
举几个例子:
如果是 11 的时候: 3 × 3 + 2;
如果是 101 的时候:10 × 10 + 1;

① 求出一个 aaa,使得 a2a^2a2 是尽可能接近 kkk 的,aaa = k\sqrt{k}k​

② 此时的 a2a^2a2 == kkk 不一定成立,而且如果将后面全部划分给c的话,如果k == 1e9的话,会爆长度1e5

③ res:表示除去 a2a^2a2 之后还有多少,res=k−a2res = k - a^2res=k−a2;

④ 从剩下的中再维护出一个 ⌊resa⌋⌊\frac{res}{a}⌋⌊ares​⌋,防止爆长度。
即:b = ⌊resa⌋+a⌊\frac{res}{a}⌋ + a⌊ares​⌋+a

⑤ 此时还剩下 resresres % aaa 的即, ccc = resresres % aaa

综上所述:
a=k,res=k−a∗a,b=⌊resa⌋+a,c=res%aa = \sqrt{k}, res = k - a * a, b = ⌊\frac{res}{a}⌋ + a, c = res \;\%\; aa=k​,res=k−a∗a,b=⌊ares​⌋+a,c=res%a

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int k;cin >> k;if (k == 0) {cout << ")(" << endl;return 0;} int a = sqrt(k), res = ceil(k - (a * a)), b = res / a + a, c = res % a;
//  cout << a << ' ' << res << ' ' << b << ' ' << c << endl;for (int i = 1; i <= a; i++) cout << '(';for (int i = 1; i <= b - 1; i++) cout << ')';for (int i = 1; i <= c; i++) cout << '(';cout << ')' << endl;return 0;
}

E.三棱锥之刻(几何)

P为正三棱锥内部的中心,PA,PD为正三棱锥外接球半径,OP为正三棱锥内切球半径

结论:已知正三棱锥的棱长为a,那么正三棱锥外接球半径为:64a\frac{\sqrt{6}}{4}a46​​a ,正三棱锥内切球半径为:612a\frac{\sqrt{6}}{12}a126​​a

//minn为正三棱锥内切球半径,maxx为正三棱锥外接球半径
double minn = sqrt(6.0) * a / 12, maxx = sqrt(6.0) * a / 4;
double area;

本题分三种情况:

  1. 当染色半径 r≤612ar ≤ \frac{\sqrt{6}}{12}ar≤126​​a时, 即染色球还未触及正三棱锥内壁,那么就无法染色
if (r <= minn) area = 0;//无法染色,染色面积自然为0
  1. 当染色半径 r≥64ar ≥ \frac{\sqrt{6}}{4}ar≥46​​a时, 即染色球已经包含整个正三棱锥,那么整个正三棱柱的内部都会染色
else if (r >= maxx) area = sqrt(3.0) / 4 * f(a);//正三棱锥一个侧面三角形的面积
  1. 当染色半径 612a≤r≤64a\frac{\sqrt{6}}{12}a ≤ r ≤ \frac{\sqrt{6}}{4}a126​​a≤r≤46​​a 时,分为两个小情况:
    (1) 当横截面积 ≤ 是三角形的内切圆 即 横截圆的半径 ≤ 36a\frac{\sqrt{3}}{6}a63​​a

此时OG为底面三角形ABC的内切圆,OG为内切圆的半径为:d=36ad = \frac{\sqrt{3}}{6}ad=63​​a ,染色圆的半径为:r

那么染色球与其中一个底面三角形ABC形成的横截圆的半径为:r1=(r−612a)2−d2r_1 = \sqrt{(r - \frac{\sqrt{6}}{12}a)^2 - d^2}r1​=(r−126​​a)2−d2​

所以:此时底面三角形ABC染色面积为:πr12πr_1^2πr12​ ,有4个面就是 4πr124πr_1^24πr12​

(2) 当 正三角形的内切圆 < 横截圆 < 正三角形的外接圆 即 染色的面积如蓝色阴影部分:

这个面积分为两个部分:等腰三角形+扇形

此时的 r1,d,2dr_1, d, 2dr1​,d,2d 如图所示

3个等腰三角形面积 = r12−d2×d×3\sqrt{r_1^2-d^2} × d × 3r12​−d2​×d×3

扇形的弧度:α=(2π−acos(dr1)×2×3)÷3α = (2π - acos(\frac{d}{r_1} )× 2 × 3) ÷ 3α=(2π−acos(r1​d​)×2×3)÷3

3个扇形面积 = α2π×π×r12×3\frac{α}{2π} × π × r_1^2 × 32πα​×π×r12​×3

else {if (r1 <= d) {area = PI * r1 * r1;} else {double area1 = sqrt(f(r1) - f(d)) * d * 3;//3个等腰三角形的面积//cos() 是已知一个角的弧度值 x,求该角的余弦值 y;而 acos() 是已知一个角的余弦值 y,求该角的弧度值 x。//扇形面积 = ((2 * PI - 三个等腰三角形的角度) * 3 / 3) / (PI * 2) * PI * f(r1);double area2 = ((((PI * 2) - (acos(d / r1) * 2) * 3) / 3) / (PI * 2)) * PI * f(r1);area = area1 + area2; }}

完整的AC代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#define ll long long
#define int ll
#define PI acos(-1)
#define MOD 1000000007
using namespace std;
int read()
{int w = 1, s = 0;char ch = getchar();while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';ch = getchar(); }return s * w;
}
//x的平方
double f(double x) {return x * x;
}
signed main() {double a;//题目给的正三棱锥的棱长double r;//题目给的染色的半径scanf("%lf%lf", &a, &r);// sqrt(6) * a / 12;是正三棱柱内切球的半径// sqrt(6) * a / 4; 是正三棱柱外接球的半径double minn = sqrt(6.0) * a / 12, maxx = sqrt(6.0) * a / 4;/*本题分三种情况:Ⅰ. 当染色半径 r <= sqrt(6) * a / 12; 那么就无法染色Ⅱ. 当染色半径 r >= sqrt(6) * a / 4;  那么整个正三棱柱的内部都会染色Ⅲ. 当染色半径 sqrt(6) * a / 12 < r < sqrt(6) * a / 4 时分为两个小情况:(1) 当横截面积 恰好是三角形的内切圆(2) 当横截面积 大于正三角形的内切圆 小于正三角形的外接圆*/double r1 = sqrt(f(r) - f(sqrt(6.0) * a / 12));//在正三棱锥的一个侧面被染色截面圆的半径double d = sqrt(3.0) / 6 * a;//正三角形的内切圆的半径double area;if (r <= minn) area = 0;else if (r >= maxx) area = sqrt(3.0) / 4 * f(a);//正三棱锥一个侧面三角形的面积else {if (r1 <= d) {area = PI * r1 * r1;} else {double area1 = sqrt(f(r1) - f(d)) * d * 3;//3个等腰三角形的面积//cos() 是已知一个角的弧度值 x,求该角的余弦值 y;而 acos() 是已知一个角的余弦值 y,求该角的弧度值 x。double area2 = 3 * ((((PI * 2) - (acos(d / r1) * 2) * 3) / 3) / (PI * 2)) * PI * f(r1);//扇形面积 = ((2 * PI - 三个等腰三角形的角度) * 3 / 3) / PI * 2 * PI * f(r1);area = area1 + area2;}}printf("%.6lf\n", area * 4);return 0;
}

F. 对答案一时爽(签到)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 200010;
char a[N], b[N];
signed main() {ios::sync_with_stdio(false);cout.tie(0);cin.tie(0);int n;cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= n; i++) cin >> b[i];int same = 0, usame = 0;for (int i = 1; i <= n; i++) {if(a[i] == b[i] && a[i] != ' ') same++;}printf("%lld 0\n", same + n);return 0;
}

I. 限制不互素对的排列(构造)

题意:给定n,k,长度为n的序列,使得其中正好有 k 对相邻的数gcd(最大公约数)大于 1

题解:
一般简单的构造题,都会有一个万能的解法,边界需要特殊判断。
这道题需要多次尝试,得出结论
① 在n == 4 && k == 1时,输出:1 4 2 3 或者 1 2 4 3
② 在n == 5 && k == 1时,输出:1 4 2 3 5 或者 1 2 4 3 5
③ 在n >= 6时,就有一个万能公式:
这个万能公式,其实题目有提示:0≤k≤n20 ≤ k ≤ \frac{n}{2}0≤k≤2n​
最多只有 n2\frac{n}{2}2n​ 对 不互素对。

以 示例2 为例子:
那么3 6首先是一对,后面的话 6和2,2和4
所以,结果也可以是:3 6 2 4 1 5
那么观察这个例子:
长度为6,我们先构造了一对 3 6 ,而后枚举偶数即可,偶数与偶数之间一定存在一个公约数2,枚举偶数只需要枚举k-1个就行了,枚举一个就用 st[ ] 数组标记一个,最后把剩下长度的顺序输出即可。
这里看个例子就懂了:

其余的情况就输出 -1

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100010;
bool st[N];
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n, k;cin >> n >> k;if (k == 0) {for (int i = 1; i <= n; i++) cout << i << ' ';cout << endl;return 0;}if (n == 4 && k == 1) {cout << "1 4 2 3" << endl;} else if (n == 5 && k == 1) {cout << "1 4 2 3 5" << endl;} else if (n >= 6) {cout << "3 6 ";st[3] = st[6] = 1;for (int i = 1; i <= k - 1; i++) {if (i == 3) {k++;continue;}cout << 2 * i << ' ';st[2 * i] = 1;}for (int i = 1; i <= n; i++) {if (!st[i]) {cout << i << ' ';if (i == 2) {cout << 5 << ' ';st[i] = 5;}}}cout << endl;} else {cout << "-1" << endl;}return 0;
}

J. 一群小青蛙呱蹦呱蹦呱

题意:要我们算出除了(2k)(3k)…(4k)(2^k)(3^k)…(4^k)(2k)(3k)…(4k) 的所有数字的最小公倍数lcm。

2021牛客寒假算法基础集训营1相关推荐

  1. 2021牛客寒假算法基础集训营1 J 一群小青蛙呱蹦呱蹦呱

    今天的比赛没打( 睡午觉去了,今天太累了 晚上来看看题 2021牛客寒假算法基础集训营1 J 一群小青蛙呱蹦呱蹦呱 题目传送门 板子题( 我们知道由唯一分解定理得,若 n=p1α1×p2α2×p3α3 ...

  2. 【解题报告】2021牛客寒假算法基础集训营4

    [解题报告]2021牛客寒假算法基础集训营4 前面的话 A :九峰与签到题 | 模拟 (签到题) B: 武辰延的字符串 | exKMP D :温澈滢的狗狗 | 二分 E: 九峰与子序列 | d p d ...

  3. 2021牛客寒假算法基础集训营2 D.牛牛与整除分块

    2021牛客寒假算法基础集训营2 D.牛牛与整除分块 题目链接 题目描述 整除分块,又称数论分块.是数论算法中的重要技巧,你可以在各种需要枚举因子的连续求和类问题中见到它的身影.如杜教筛,莫比乌斯反演 ...

  4. 2021牛客寒假算法基础集训营5 B.比武招亲(上)

    2021牛客寒假算法基础集训营5 B.比武招亲(上) 题目链接 题目描述 众所周知,天姐姐只喜欢天下最聪明的人,为了找到这样的人,她决定比武招亲! 只见天姐姐在榜上留下了这样一道问题,谁做出来了就可以 ...

  5. 2021牛客寒假算法基础集训营4

    九峰与签到题 链接:https://ac.nowcoder.com/acm/contest/9984/A 来源:牛客网 题目描述 九峰正在准备一场毒瘤比赛,他是如此毒瘤以致于他想方设法降低通过率,他认 ...

  6. 2021牛客寒假算法基础集训营5 比武招亲(上)(组合数)

    链接:https://ac.nowcoder.com/acm/contest/9985/B 来源:牛客网 题目描述 众所周知,天姐姐只喜欢天下最聪明的人,为了找到这样的人,她决定比武招亲! 只见天姐姐 ...

  7. 2021牛客寒假算法基础集训营3,签到题DGHIJ

    D. Happy New Year!模拟 #include<bits/stdc++.h> using namespace std; int main(){ios::sync_with_st ...

  8. 2021牛客寒假算法基础集训营6 J.天空之城

    J.天空之城 题目链接:https://ac.nowcoder.com/acm/contest/9986/J 题目描述: 天空之城有5个小镇,名字分别为Ada, Aed, Akk, Orz, Apq, ...

  9. 2021牛客寒假算法基础集训营1 题解

    A.串 题解: dp 三维dp可能更好理解一些. dp[i][j][k]dp[i][j][k]dp[i][j][k]代表长度为iii的字符串,当j=1时代表已经含有u了的字符串的个数,k=1时代表已经 ...

最新文章

  1. 深度丨MIT重磅报告:一文看清AI商业化现状与未来
  2. document对象详解
  3. Oracle的left join中on和where的区别
  4. mybaits十六:使用choose标签实现分支选择
  5. Allegro16.6软件布局设计技巧:模块复用
  6. detachedcriteria查询去重_2020考研初试成绩查询:安徽研究生考试成绩查询入口
  7. 杂谈(23)也说高考
  8. mybatis逆向工程 生成代码
  9. postSql insert into 去重
  10. matlab数学建模试卷,matlab数学建模习题
  11. 3600000毫秒等于多少小时_一秒多少毫秒
  12. 百度地图点聚合,加载1万个marker
  13. PPT幻灯片放映时不显示视频(旁白)
  14. icom对讲机写频线定义_哈罗CQ火腿社区 - QRP and DIY - 各种写频线的资料,放上来备用吧 - Powered by phpwind...
  15. The requested URL was not found on this serve
  16. Windows系统盘瘦身
  17. c语言函数变量地址符,C语言中取地址符做函数形参?—— 引用的讨论
  18. SaToken技术分享文档
  19. Spring Web(第一部分)
  20. excel - 选择无限远区域(无穷区域)+ 取消隐藏 第一行

热门文章

  1. vue2数据双向绑定的原理
  2. Git:git-merge的--ff和--no-ff
  3. java IO读写文件详细介绍
  4. 拍拍乐(一)如何在照片里变瘦
  5. Hadoop应用实验 Linux环境配置
  6. 长链接(url)转换为短字符串,再把url和短字符串存数据库(有短域名方案)
  7. 计算机休眠查询,可不可以查询电脑待机记录
  8. 第四章 字体和格式相关
  9. 注册电子邮箱帐号优点
  10. 中国移动光猫GM 219-S获取管理员密码