第十届蓝桥杯A组c++RSA(扩展欧几里得+快速幂)

在这里插入图片描述
这个题刚看上去的时候其实我也不会,所以我百度了很多,主要还是这个题的知识点我都没有学过,所以拿到之后毫无办法,好了,开始步入正题
首先,还有d*e/(p-1)(q-1)=□余1,这个如果学过欧几里得扩展的话,一看就能看出来,而那个次方就更简单了,直接用快速幂,如果暴力的话,可能会爆掉。
扩展欧几里得

long long e_gcd(long long a,long long b,long long &x,long long &y)
{
	if(b==0)
	{
		x=1;
		y=2;
		return a;
	}
	long long ans=e_gcd(b,a%b,x,y);
	long long temp=x;
	x=y;
	y=temp-a/b*y;
	return ans;
}

快速幂

LL binaryPow(LL a,LL b,LL m)
{
	if(b==0)//b为0,则a^0=1;
		return 1;
	if(b%2==1)//b为奇数,则转化为b-1;
		return a*binaryPow(a,b-1,m)%m;
	else
	{//b为偶数,转化为b/2;
		LL mul=binaryPow(a,b/2,m);
		return mul*mul%m;
	}
}

//我看到这个题以为是用快速幂,结果发现快速幂爆掉了,而且看了大佬的代码,才知道用的是快速乘求余,很笨,o(╯□╰)o

long long quickmul(long long a,long long b)
{
    long long sum=0;
    while(b)
    {
        if(b%2==1)
            sum=(sum+a)%n;
        a=(a+a)%n;
        b=b/2;
    }
    return sum;
}
long long quickmod(long long a,long long b)
{
    long long ans=1;
    while(b)
    {
        if(b%2==1)
            ans=quickmul(ans,a);
        a=quickmul(a,a);
        b=b/2;
    }
    return ans;
}

全部代码:

#include <bits/stdc++.h>
using namespace std;
long long n=1001733993063167141;
long long d=212353;
long long c=20190324;
long long p=891234941;
long long q=1123984201;
long long e=823816093931522017;
long long phi=(p-1)*(q-1);
void Ex_gcd(long long a,long long b,long long &x,long long &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return ;
    }
    long long x1,y1;
    Ex_gcd(b,a%b,x1,y1);
    x=y1;
    y=x1-(a/b)*y1;
}
long long quickmul(long long a,long long b)
{
    long long sum=0;
    while(b)
    {
        if(b%2==1)
            sum=(sum+a)%n;
        a=(a+a)%n;
        b=b/2;
    }
    return sum;
}
long long quickmod(long long a,long long b)
{
    long long ans=1;
    while(b)
    {
        if(b%2==1)//末位是1;
            ans=quickmul(ans,a);//这是直接的回溯法,从最后一位起,如果,如果最后一位是1,则乘a,然后在进行乘以它本身,以为乘1之后一定为偶数,也就是b/2;
        a=quickmul(a,a);
        b=b/2;
    }
    return ans;
}
int main()
{
    long long x,y;
    Ex_gcd(d,(q-1)*(p-1),x,y);
    x=(x+phi)%phi;
    printf("e=%lld\n",x);
    printf("ans=%lld\n",quickmod(c,e));
    return 0;
}

作者:兔蠢蠢
来源:CSDN
原文:https://blog.csdn.net/ftx456789/article/details/89075158
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值