算法竞赛入门【码蹄集进阶塔335题】(MT2251-2270)
文章目录
- 算法竞赛入门【码蹄集进阶塔335题】(MT2251-2270)
- 前言
- 目录
-
- 1. MT2251 讲价
- 2. MT2252 复数类1
- 3. MT2253 复数类2
- 4. MT2254 复数类3
- 5. MT2255 复数类4
- 6. MT2256 约数个数
- 7. MT2257 约数之和
- 8. MT2258 有一个计数问题
- 9. MT2259 tax
- 10. MT2260 数树
- 11. MT2261 循环
- 12. MT2262 全部相同
- 13. MT2263 石头剪刀布
- 14. MT2264 异或
- 15. MT2265 除法
- 16. MT2266 除法2
- 17. MT2267 余数之和
- 18. MT2268 大整数乘法
- 19. MT2269 模数
- 20. MT2270 约数个数
- 结语
前言

为什么突然想学算法了?
> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个暑假速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~

为什么选择码蹄集作为刷题软件?
码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
目录
1. MT2251 讲价
(1)题目描述
给定整数n,现在规定每一轮小码哥可以从中取出一段连续的几位数字,剩余数字即为该轮得分,结果可以拥有前导0。特别的,如果小码哥取出了所有数字,那么该轮得分为0。
现在请你求出所有不同取法得分之和对1e9+7取模后的值。特别的,如果有多种不同取法得到了同样的数字,得分要计多次。
格式
输入格式: 输入一行一个整数n ,表示要被取的数。
.
输出格式: 输出一行一个整数,表示得分之和对1e9+7取模后的值。
样例1
输入: 107
.
输出: 42
备注:
其中: 1≤n≤<10100000
关于样例的解释:
可以取1,0,7,10,07,107
得分07+17+10+7+1+0 = 42
(2)参考代码
MOD = 10**9+7
def pow_mod(a,k,p):
ans=1
pow_val = a%p
while k!=0:
if k&1 !=0:
ans = (ans*pow_val)%p
pow_val = (pow_val**2)%p
k>>=1
return ans
def main():
s = input()
n = len(s)
arr = [ord(ch)-ord('0') for ch in s]
pow_v = n-1
ans = 0
S = 0
for i in range(n):
if i>=1:
ans+=(arr[i]*((i+1)*i//2))*pow_mod(10,pow_v,MOD)
ans %=MOD
k = (n-1)-i+1
ans+=(k*S)*pow_mod(10,pow_v,MOD)
ans%=MOD
S+=arr[i]
pow_v-=1
print(ans)
if __name__ == '__main__':
main();
2. MT2252 复数类1
(1)题目描述
请你创建一个复数类,在本题中要求实现复数类的读入和输出。
本题测试数据中,读入时不一定是最简(行首正实数前面可能有”+”号),但输出时要求最简。
最简情况是:实数直接表示,虚数以”a+bi”(其中”+”号也可能是”-“号,且a若为0则不显示,b若为1则不显示,基本和书面写法一样,可参考样例)的格式表示。
格式
输入格式:
第一行输入一个整数n,n表示数据组数。
接下来n行,每行输入一个复数(以类似”a+bi”的格式输入,但不一定最简,可能会有多个项,输入的项的系数是浮点数)。
.
输出格式:
输出n行,按题目描述中“最简情况”输出读入得到的复数,浮点数用cout或printf( "%g”)输出。
样例1
输入:
8
123
0i
i
i+3
3-i
7.6+1i
76.7-0.66i
3i+7i+8i+9+0+03.67i+10
.
输出:
123
0
i
3+i
3-i
7.6+i
76.7-0.66i
19+21.67i
备注:
可以借助C++的STL中的complex头文件。浮点数请使用double类型。保证:对于100%的数据: 1≤n ≤100,000,每行输入非空字符串长度不超过1000,输入的浮点数最多精确到小数点后两位。
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int n;
complex<double> c;
void inputComplex(complex<double> &cplx){
bool sgn,inpnum;
double num,dec;
cplx.real(0);
cplx.imag(0);
char x = getchar();
while(x!='-'&&x!='i'&&(x<'0'||x>'9')) x=getchar();
while(x=='-' || x=='+' || x=='i' || (x>='0'&&x<='9')){
sgn=0;
if(x=='-'){
sgn=1;
x=getchar();
}else if(x=='+') x=getchar();
num=0;
inpnum = false;
while(x>='0'&&x<='9'){
inpnum = true;
num *= 10;
num += x-'0';
x = getchar();
}
if(x=='.'){
x = getchar();
dec = 1;
while(x>='0'&&x<='9'){
dec /= 10;
num += dec*(x-'0');
x = getchar();
}
}
if(x=='i'){
if(!inpnum) cplx.imag(cplx.imag()+sgn?-1:1);
else cplx.imag(cplx.imag()+(sgn?-num:num));
x = getchar();
}else cplx.real(cplx.real()+(sgn?-num:num));
}
}
void outputComplex(complex<double> cplx){
if(cplx.imag()==0) cout<<cplx.real();
else{
if(cplx.real()==0){
if(cplx.imag()==1) cout<<'i';
else if(cplx.imag()== -1) cout<<"-i";
else cout<<cplx.imag()<<"i";
}else{
if(cplx.imag()==1) cout<<cplx.real()<<"+i";
else if(cplx.imag()==-1) cout<<cplx.real()<<"-i";
else cout<<cplx.real()<<showpos<<cplx.imag()<<noshowpos<<"i";
}
}
}
complex<double> conjugateComplex(complex<double> cplx){
cplx.imag(-cplx.imag());
return cplx;
}
int main()
{
scanf("%d",&n);
while(n--){
inputComplex(c);
outputComplex(c);
printf("\n");
}
return 0;
}
3. MT2253 复数类2
(1)题目描述
请你创建一个复数类,在本题中要求实现复数类的求共辄复数和求模操作。
做本题之前,最好先完成同系列题目《复数类1》,本题的复数输入输出要求与相同。
格式
输入格式:
第一行输入一个整数n,n表示数据组数。接下来n行,每行输入一个复数。
.
输出格式: 输出n行,每一行对于其输入的复数,输出其共辄复数和模,以空格隔开。
样例1
输入:
8
123
0i
i
i+3
3-i
7.6+1i
76.7-0.66i
3i+7i+8i+9+0+03.67i+10
.
输出:
123 123
0 0
-i 1
3-i 3.16228
3+i 3.16228
7.6-i 7.66551
76.7+0.66i 76.7028
19-21.67i 28.8199
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int n;
complex<double> c;
void inputComplex(complex<double> &cplx){
bool sgn, inpnum; //0:pos, 1:neg
double num, dec; //num:读入的数(不含符号位), dec:decimal小数点后的
cplx.real(0); //先初始化实部虚部为0
cplx.imag(0);
char x = getchar(); //开始读取
while (x!='-'&&x!='i'&&(x<'0'||x>'9')) x = getchar(); //不读取无关符号
while (x=='-'||x=='+'||x=='i'||(x>='0'&&x<='9')){
//当读取到了有关符号,若读取到无关符号再退出循环
sgn = 0; //一开始符号位为正
if (x=='-'){
//读取符号位
sgn = 1;
x = getchar();
}else if (x=='+') x = getchar();
num = 0; //一开始数字位为0
inpnum = false; //用于判断是否输入了数字,用于判断"i"前无数字的特殊情况
while (x>='0'&&x<='9'){
//读取数字
inpnum = true;
num *= 10;
num += x-'0';
x = getchar();
}
if (x=='.'){
//读取小数点后数字
x = getchar();
dec = 1;
while (x>='0'&&x<='9'){
dec /=

最低0.47元/天 解锁文章
2173

被折叠的 条评论
为什么被折叠?



