hdu2035 A^B (同余及其基本性质,快速幂)

开始用了pow函数,6789^10000算出来时负的,应该是超了,但是网上搜了一下说c++的pow()是支持longlong的提供重载函数的https://blog.csdn.net/major_zhang/article/details/51456681,难道是结果超了???

后来又发现循环内部变量用的int……

再后来……循环*A;还是wa……

重点在这:一直乘下去,结果会超,有一个数学规律:结果每次对1000取余,后三位不变,不懂个话,补一下数论知识(同余运算及其基本性质)

http://www.matrix67.com/blog/archives/236

代码:

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
    long long int n,m;
    while(cin>>n>>m)
    {
        if(n==0&&m==0)
        break;
        long long int t=1;
        for(long long int i =1;i<=m;i++)
        {
            t*=n;
            if(t>=1000)
                t = t%1000;
            }
        cout<<t<<endl;
    }
    return 0;
}

快速幂:

快速幂可以高效的计算幂运算。如果我们使用循环来计算的话,那么时间复杂度就是 O(n) ,使用快速幂的话就只用 O(log n)。

如果我们求解 2^k。可以将其表示为

x^n =( (x2)2....)

只要做k次平方运算就可以了,由此我们可以想到,先将n表示为2的幂方次之和

n = 2^k1 + 2^k2 + 2^k3...

就有

x^n = x^(2^k1) x^(2^k2) x^(2^k3)...

快速幂模板:

typedef long long ll; //注意这里不一定都是long long 有时 int 也行
ll mod_pow(ll x, ll n, ll mod){
    ll res = 1;
    while( n > 0 ){
        if( n & 1 ) res = res * x % mod;    //n&1其实在这里和 n%2表达的是一个意思
        x = x * x % mod;
        n >>= 1;                 //n >>= 1这个和 n/=2表达的是一个意思
    }
    return res;
}

递归版:

typedef long long ll;
ll mod_pow(ll x, ll n, ll mod){
    if( n == 0 ) return 1;
    ll res = mod_pow( x * x % mod, n / 2, mod );
    if( n & 1 ) res = res * x % mod;
    return res;
}

快速幂解决这道题:

#include<stdio.h>
int mod_pow(int x, int n,int mod){      //快速幂
    int res = 1;
    while( n > 0 ){
        if( n & 1 ) res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return res;
}
int main(){
    int m,n;
    while(scanf("%d%d",&m,&n),n||m)
        printf("%d\n",mod_pow(m,n,1000));
    return 0;
}

原文地址:https://www.cnblogs.com/lyqf/p/9741975.html

时间: 2024-11-07 08:03:56

hdu2035 A^B (同余及其基本性质,快速幂)的相关文章

Uva 11609 - Team ( 组合数学 + 二项式性质 + 快速幂取模 )

Uva 11609 - Team ( 组合数学 + 二项式性质 + 快速幂取模 ) 题意: 有N个人,选一个或多个人参加比赛,其中一名当队长,有多少种方案? (如果参赛者完全相同但是队长不同,也算是一种情况) [ 1<=n <= 10^9 ] 分析: 这题要用到组合式公式的性质 转化之后快速幂取模轻松搞定之 代码: //Uva 11609 - Team /* 组合数公式 + 二项式系数性质 + 快速幂 手动自己推 -> F[n] = C(n,1)*1 + C(n,2)*2 + C(n,n

取模性质,快速幂,快速乘,gcd和最小公倍数

一.取模运算 取模(取余)运算法则: 1. (a+b)%p=(a%p+b%p)%p; 2.(a-b)%p=(a%p-b%p)%p; 3.(a*b)%p=(a%p * b%p)%p; 4.(a^b)%p=(   (a%p)^b  )%p; 5. (  (a+b)%p+c  )%p=( a+(b+c)%p  )%p; 6.( a*(b*c)%p )%p =( c*(a*b)%p )%p; 7.( (a+b)%p*c )%p= ( (a*c)%p + (b*c)%p )%p; 几条重要性质: 1.a≡

【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. 在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论起了二叉搜索树.什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树.设key[p]表示结点p上的数值.对于其中的每个结点p,若其存在左孩子lch,则key

模板 快速幂|取余

前置知识 (1)如果将 aa 自乘一次,就会变成 a^2a2 .再把 a^2a2 自乘一次就会变成 a^4a4 .然后是 a^8a8…… 自乘 nn 次的结果是 a^{2^{n}}a2n .对吧…… (2)a^xa^y = a^{x+y}axay=ax+y,这个容易. (3)将 bb 转化为二进制观看一下: 比如 b = (11)_{10}b=(11)10? 就是 (1011)_{2}(1011)2? .从左到右,这些 11 分别代表十进制的 8,2,18,2,1.可以说 a^{11} = a^

快速幂取余算法

下面是一个快速幂的介绍: 先贴一个秦九韶算法(Horner算法)的原理: 设有项的次函数 将前项提取公因子,得 再将括号内的前项提取公因子,得 如此反复提取公因子,最后将函数化为 令 ...... 则即为所求 下面是讲解快速幂的:(By  夜せ︱深   感谢作者) 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求

HDU1061_Rightmost Digit【快速幂取余】

Rightmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 33161    Accepted Submission(s): 12696 Problem Description Given a positive integer N, you should output the most right digit of

Luogu P1226 取余运算||快速幂(数论,分治)

P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^p mod k=s" s为运算结果 输入输出样例 输入样例#1: 2 10 9 输出样例#1: 2^10 mod 9=7 这是一道很有趣的水题,如果知道公式. 一般求解会溢出,导致答案错误. 这里介绍取模的一个公式: a*b%k=(a%k)*(b%k)%k. 在我们这道题中是b^p = (b^(p/

NYOJ 420 p次方求和 (快速幂+同余定理)

题目描述: http://acm.nyist.net/JudgeOnline/problem.php?pid=420 一个很简单的问题,求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 题目分析: 快速幂

hdu 4965 矩阵快速幂 矩阵相乘性质

Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 170    Accepted Submission(s): 99 Problem Description One day, Alice and Bob felt bored again, Bob knows Alice is a gir