【快速幂模板】 nyoj102 次方求摸 420 p次方求和(快速幂+同余定理)

一般循环求解时间复杂度O(N)

快速幂时间复杂度O(log2(N))


求a^b

原理 :将b转化为二进制

           该二进制数第i位的权为

   如a^11

        11的二进制是1011
        11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1

a^11=

code:

int pow(int a,int b)
{
    int r=1;
    while(b)
    {
        if(b&1)
        {
            r*=a;
        }
        a*=a;
        b>>=1;
    }
    return r;
}


次方求模

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述

求a的b次方对c取余的值

 

输入
第一行输入一个整数n表示测试数据的组数(n<100)
每组测试只有一行,其中有三个正整数a,b,c(1=<a,b,c<=1000000000)
输出
输出a的b次方对c取余之后的结果
样例输入
3
2 3 5
3 100 10
11 12345 12345
样例输出
3
1
10481
code:

#include<stdio.h>
long long pow(int a,int b,int c)
{
    long long m=a%c;
    long long r=1;
    while(b)
    {
        if(b&1)
            r=(r*m)%c;
        m=(m*m)%c;
        b>>=1;

    }
    return r;
}
int main()
{
    int T,a,b,c;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&a,&b,&c);
        long long r=pow(a,b,c);
        printf("%lld\n",r);
    }
}

p次方求和

时间限制: 1000 ms  |  内存限制: 65535 KB
难度:3
描述
一个很简单的问题,求1^p+2^p+3^p+……+n^p的和。
输入
第一行单独一个数字t表示测试数据组数。接下来会有t行数字,每行包括两个数字n,p,
输入保证0<n<=1000,0<=p<=1000。
输出
输出1^p+2^p+3^p+……+n^p对10003取余的结果,每个结果单独占一行。
样例输入
210 110 2
样例输出
55385


快速幂+同余定理

code:

#include<stdio.h>
#define c 10003
int pow(int a,int b)
{
    int r=1;
    while(b)
    {
       if(b&1)
       {
           r=(r*a)%c;
       }
       a=(a*a)%c;
       b>>=1;
    }
    return r;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,p,ans=0;
        scanf("%d%d",&n,&p);
        for(int i=1;i<=n;i++)
        {
            ans+=pow(i,p);
            ans%=c;
        }
        printf("%d\n",ans);
    }
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值