北京化工大学寒假集训【BUCTOJ】(1)1-6题

1.快速幂

题目描述
求 a 的 b 次方对 p 取模的值,其中 0≤a,b≤10^9 , 0<p≤10^9
输入
三个用空格隔开的整数a,b和p。
输出
一个整数,表示a^b mod p的值。
样例输入
2 3 9
样例输出
8
对于本题,按照以往的思路是直接循环进行乘法,同时,边乘边取模,最终能够得到结果,但是本题由于乘的次数过多导致运算时间过于长,所以要考虑的就是怎样通过改进算法来缩短计算时间
这里就有了快速幂,快速幂的目的就是快速求出幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多。它的原理如下:
当幂指数非常大的时候,我们并没有必要一次又一次的反复求,假设我们本来要求21024我们可以依次求得22、24、28、……21024这样,原本需要1024次循环,现在只用了10次,时间也就大大缩短了。
同理我们可以推进到一般情况,b可以拆解为若干不重复的2的次幂的和的形式,即可以用二进制的形式来表示,巧妙的运用位运算或者模运算,可以得到每一位前的系数为0或者1来达到快速幂的目的

#include<bits/stdc++.h>
using namespace std;
long long a,b,p;
long long f(long long a,long long b,long long p)
{
   
    if(!p) return 0;
    long long flag=1;
    while(b)
    {
   
        if(b&1)  flag=flag*a%p;
        a=a*a%p;
        b>>=1;
    }
    flag %=p;
    return flag;
}
int main()
{
   
    scanf("%lld%lld%lld",&a,&b,&p);
    printf("%lld",f(a,b,p));
}

2.高精度乘法

题目描述
求a乘b对p取模的值,其中1≤a,b,p≤1018
输入
输入3个long long型整数,a,b,p
输出
输出a*b%p的值
样例输入
250182048980811753
413715569939057660
133223633696258584
样例输出
19308689043391716
对于本题,基本思想与第一题相同,只不过是将原本最终处理的乘法换为加法

#include<bits/stdc++.h>
using namespace std;
long long a,b,p;
long long f(long long a,long long b,long long p)
{
   
    long long flag=0;
    while(b)
    {
   
        if(b&1)  flag=(flag+a)%p;
        a=(a+a)%p;
        b>>=1;
    }
    flag%=p;
    return flag;
}
int main()
{
   
    scanf("%lld%lld%lld"
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值