`
hellojyj
  • 浏览: 62115 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

ACM中大数幂运算,输出结果后几位

    博客分类:
  • ACM
阅读更多

我也是ACM初学者,最近为了准备校赛去做了好多工具题,比如说关于贪心问题,果园问题,大数阶乘,大数幂运算等等。现在就关于大数幂运算来探讨下怎么让你的算法又快又准!

 

原题来自:HDU2035(传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2035);

 

Problem Description

 

求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
 

 

Input

 

输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
 

 

Output

 

对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
 

 

Sample Input
2 3 12 6 6789 10000 0 0
 

 

Sample Output
8 984 1
 

 

Author

 

lcy
 

 

Source

 

 

 

 

Recommend

 

lcy   |   We have carefully selected several similar problems for you:  1021 2034 1008 2033 1108

10000^10000次怎么想也是超过了long的存储范围,所以暴力运算pow(10000,10000)求解是根本不行的!而且这道题目的时间限制也是在1S秒,如果你暴力求解时间复杂度O(n*n),n=10000的时候也肯定是超时的!

 

为了解决溢出问题,我们不能再完全计算后取摸,我们可以在a^b可以看成a*a*a.......(b个a相乘),我们可以在每两个a相成之后取模,那么第一次我们就可以分成(如果b一直都是偶数)b/2组a*a%1000,然后把每组a*a%1000的值赋值给a,b= b/2;这样在我们有面对的就是a^b模型了。一直迭代下去一直到b==1为止!输出b==1的时候a的值就是所要的结果!这样又解决了时间超时的问题,这种算法的时间复杂度为O(log2(n));

 

刚才我们假设的是b一直是偶数的情况,当时这种情况是极少发生的(当且仅当a = 2^n的时候成立)这个时候我们需要考虑如果b%2 != 0的情况也就是说b是奇数,这说明了在某次运算时候这些a*a*a...必定存在一个落单的a。尽管它是落单的,但是它也在影响着最后的结果。为了解决这个问题,我们可以定义一个变量用来收集所有在计算过程中落单的a;这里我初始化int left = 1;每次有落单的a,left = left *a%1000;这样我们就收集了所有落单的a;

 

好了分析到这里我们用代码说话吧!

#include<iostream>
using namespace std;
int main(){
    int A,B;
    while(cin>>A>>B){
        int left=1;
        int result;
        if(A == 0)break;
        while(B!=2&&B!=1){
            if(B%2==1){
                    B--;
                    left = left*A%1000;
                    A = A*A%1000;
                    B = B/2;
            }else{
                A = A*A%1000;
                B = B/2;
            }
        }
        if(B==2){
            result = A*A%1000;
            result = result*left%1000;
        }else{
            result = A*left%1000;

        }
        cout<<result<<endl;
    }
    return 0;
}

 

 

 

 

0
0
分享到:
评论

相关推荐

    ACM中的位运算 方格取数 公共子序列

    - **按位与等于(&=)**、**按位或等于(|=)**和**按位异或等于(^=)**:分别与另一个数进行位运算后赋值回自身。 3. **位域**: - 在C语言中,位域允许在一个结构体中定义特定宽度的字段,比如`struct bitv{...

    北大ACM高精度幂

    3. **累加结果**:最终通过累加所有小幂运算的结果得到最终的大数幂运算结果。 ### 总结 本篇文章详细介绍了“北大ACM高精度幂”的核心概念、实现原理以及代码分析。通过使用特殊的栈结构和自定义的数据类型,该...

    大数浮点数幂运算(c++实现)

    自己写得大数浮点数幂运算(c++实现),系poj acm 的problem:1001的实现

    ACM位运算技巧大全.doc(超级详细)

    - **判断是否为2的幂**:通过检查一个数与其减1后的按位与运算结果是否为0来判断该数是否为2的幂。 ```plaintext boolean isPowerOfTwo(int x) { return (x &gt; 0) && ((x & (x - 1)) == 0); } ``` - **不使用...

    ACM位运算技巧

    4. **判断是否为2的幂**:如果一个数与其减1的结果进行按位与运算后结果为0,且该数非0,则该数是2的幂。 5. **不使用临时变量交换两个数**:利用位异或的性质,无需额外空间即可完成交换。 6. **计算绝对值**:通过...

    ACM中大数相加的源代码

    大数相加的代码,才写的,最近开始做的oj.不好的请多多包涵!

    ACM输入输出规则

    ACM输入输出规则是参与ACM国际大学生程序设计竞赛的关键技能之一,它确保参赛者能够准确无误地按照题目要求处理输入数据并输出结果,从而避免因格式错误而导致的Presentation Error(PE)。在ACM竞赛中,自动评测...

    acm竞赛位运算简介及实用技巧

    位运算在ACM竞赛中是不可或缺的技巧,尤其是在优化算法和提高程序运行效率时。本文主要介绍了位运算的基础知识和一些实用技巧,适用于各种编程语言,如C和Pascal。 位运算涉及到对数字的二进制表示直接进行操作,这...

    ACM输入输出介绍

    ACM输入输出介绍

    C++大数模板。ACM必备

    处理大数的模板,C++大数模板。ACM必备

    ACM 入门——输入输出

    在ACM(国际大学生程序设计竞赛)中,输入输出是解决问题的基础步骤,本文将针对初学者,介绍如何处理各种类型的输入输出场景。 首先,输入是获取数据的关键。在ACM编程中,通常会遇到以下四种情况: 1. 只有一组...

    ACM完全数代码

    ACM,完全数,代码

    ACM资料 位运算技巧

    "ACM资料 位运算技巧" 位运算是计算机科学中的一种基本操作,直接对整数在内存中的二进制位进行操作。位运算可以用于各种实际应用,例如判断奇偶数、取二进制的最末位、对二进制的特定一位进行取反操作等。 在...

    ACM基本输入输出

    ### ACM基本输入输出知识点 #### 一、评测系统的反馈信息 在ACM国际大学生程序设计竞赛中,自动评测系统会根据提交的程序给出相应的反馈信息。这些反馈信息可以帮助参赛者了解程序的问题所在,并据此进行调整。 1...

    ACM大数四则运算模板函数

    ### ACM大数四则运算模板函数详解 在计算机科学领域,特别是编程竞赛中,处理大数的四则运算是一个非常常见的需求。由于标准的数据类型(如`int`、`long`等)无法存储非常大的数值,因此需要设计特殊的大数处理算法...

    ACM基础模板(宏定义、快读快写、快速幂、gcd、组合数与Lucas定理)(csdn)————程序.pdf

    这篇文档主要介绍了ACM竞赛中常用的编程技巧和算法模板,包括宏定义、快速输入输出、快速幂运算、最大公约数(GCD)、最小公倍数(LCM)、扩展欧几里得算法、以及组合数计算与Lucas定理。下面我们将逐一详细讲解这些知识...

    ACM中大数相乘的问题源代码

    大数相乘的代码,也是才写好的,通过了测试系统,写的不好的,请多多包涵

Global site tag (gtag.js) - Google Analytics