快速幂

一、快速幂:快速幂是一种求n的m次方的一种很省时的方法,利用二进制的思想,但需要注意的是,在求解的过程中,需要不断取模,因为这个数可能连long long都存不下。一般求解题都会让取模。而且有一个取模公式需要说一下:(a * b) % c = (a%c * b%c) % c. (时间复杂度(o(logn)))

例题:
1、给出一个整数N,输出N^N(N的N次方)的十进制表示的末位数字。
Input
一个数N(1 <= N <= 10^9)
Output
输出N^N的末位数字
Sample Input
13
Sample Output
3

#include<stdio.h>//求末位数字就是幂对10取模
typedef long long ll;
ll pow_mod(ll a,ll b,int mod)//快速幂就是利用二进制快速求一个数的几次幂 
{
    ll r = 1;
    while(b)
    {
        if(b&1) r*=a%mod;//b&1是取b的最后一位 
        a=a*a%mod;
        b>>=1; 
    }
    return r%10;
} 

int main()
{
    ll n;
    scanf("%lld",&n);
    printf("%lld\n",pow_mod(n,n,10));
}

2、求n的m次方对c取余

#include<stdio.h>

typedef long long ll;
ll pow_mod(ll a,ll b,ll c)//快速幂就是利用二进制快速求一个数的几次幂 
{
    ll r = 1;
    while(b)
    {
        if(b&1) r *= a % c;//b&1是取b的最后一位 
        a = a*a % c;
        b >>= 1; 
    }
    return r % c;
} 

int main()
{
    ll a,b;
    scanf("%lld %lld",&a,&b);
    printf("%lld",pow_mod(a,b));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值