我也是ACM初学者,最近为了准备校赛去做了好多工具题,比如说关于贪心问题,果园问题,大数阶乘,大数幂运算等等。现在就关于大数幂运算来探讨下怎么让你的算法又快又准!
原题来自:HDU2035(传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2035);
说明:A^B的含义是“A的B次方”
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; }
相关推荐
- **按位与等于(&=)**、**按位或等于(|=)**和**按位异或等于(^=)**:分别与另一个数进行位运算后赋值回自身。 3. **位域**: - 在C语言中,位域允许在一个结构体中定义特定宽度的字段,比如`struct bitv{...
3. **累加结果**:最终通过累加所有小幂运算的结果得到最终的大数幂运算结果。 ### 总结 本篇文章详细介绍了“北大ACM高精度幂”的核心概念、实现原理以及代码分析。通过使用特殊的栈结构和自定义的数据类型,该...
自己写得大数浮点数幂运算(c++实现),系poj acm 的problem:1001的实现
- **判断是否为2的幂**:通过检查一个数与其减1后的按位与运算结果是否为0来判断该数是否为2的幂。 ```plaintext boolean isPowerOfTwo(int x) { return (x > 0) && ((x & (x - 1)) == 0); } ``` - **不使用...
4. **判断是否为2的幂**:如果一个数与其减1的结果进行按位与运算后结果为0,且该数非0,则该数是2的幂。 5. **不使用临时变量交换两个数**:利用位异或的性质,无需额外空间即可完成交换。 6. **计算绝对值**:通过...
大数相加的代码,才写的,最近开始做的oj.不好的请多多包涵!
ACM输入输出规则是参与ACM国际大学生程序设计竞赛的关键技能之一,它确保参赛者能够准确无误地按照题目要求处理输入数据并输出结果,从而避免因格式错误而导致的Presentation Error(PE)。在ACM竞赛中,自动评测...
位运算在ACM竞赛中是不可或缺的技巧,尤其是在优化算法和提高程序运行效率时。本文主要介绍了位运算的基础知识和一些实用技巧,适用于各种编程语言,如C和Pascal。 位运算涉及到对数字的二进制表示直接进行操作,这...
ACM输入输出介绍
处理大数的模板,C++大数模板。ACM必备
在ACM(国际大学生程序设计竞赛)中,输入输出是解决问题的基础步骤,本文将针对初学者,介绍如何处理各种类型的输入输出场景。 首先,输入是获取数据的关键。在ACM编程中,通常会遇到以下四种情况: 1. 只有一组...
ACM,完全数,代码
"ACM资料 位运算技巧" 位运算是计算机科学中的一种基本操作,直接对整数在内存中的二进制位进行操作。位运算可以用于各种实际应用,例如判断奇偶数、取二进制的最末位、对二进制的特定一位进行取反操作等。 在...
### ACM基本输入输出知识点 #### 一、评测系统的反馈信息 在ACM国际大学生程序设计竞赛中,自动评测系统会根据提交的程序给出相应的反馈信息。这些反馈信息可以帮助参赛者了解程序的问题所在,并据此进行调整。 1...
### ACM大数四则运算模板函数详解 在计算机科学领域,特别是编程竞赛中,处理大数的四则运算是一个非常常见的需求。由于标准的数据类型(如`int`、`long`等)无法存储非常大的数值,因此需要设计特殊的大数处理算法...
这篇文档主要介绍了ACM竞赛中常用的编程技巧和算法模板,包括宏定义、快速输入输出、快速幂运算、最大公约数(GCD)、最小公倍数(LCM)、扩展欧几里得算法、以及组合数计算与Lucas定理。下面我们将逐一详细讲解这些知识...
大数相乘的代码,也是才写好的,通过了测试系统,写的不好的,请多多包涵