算法竞赛入门【码蹄集进阶塔335题】(MT2251-2270)

算法竞赛入门【码蹄集进阶塔335题】(MT2251-2270)



前言

在这里插入图片描述

为什么突然想学算法了?

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

在这里插入图片描述


为什么选择码蹄集作为刷题软件?

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(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 /= 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ぃ灵彧が

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值