HDU2035 人见人爱A^B(快速幂)

描述:

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

输入:

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

输出:

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

样例输入:

2 3

12 6

6789 10000

0 0

样例输出:

8

         984

         1

傻瓜代码如下(非快速幂):

 1 #include<cstdio>
 2 int main()
 3 {
 4     int a,b;
 5     int k=1;
 6     while(scanf("%d %d",&a,&b)!=EOF&&(a!=0&&b!=0)){
 7         for(int i=1;i<=b;i++){
 8             k*=a;
 9             k%=1000;
10         }
11         printf("%d\n",k);
12         k=1;
13     }
14
15     return 0;
16 } 

快速幂代码:

 1 #include<cstdio>
 2 int fastpow(int a,int b,int kkk){
 3     int ans=1;
 4     while(b > 0){
 5         if(b & 1){
 6             ans = ans*a%kkk;
 7         }
 8         b >>= 1;
 9         a= a*a%kkk;
10     }
11     return ans;
12 }
13 int main()
14 {
15     int a,b;
16     int sum;
17     while(scanf("%d %d",&a,&b)!=EOF&&(a!=0&&b!=0)){
18         sum = fastpow(a,b,1000);
19         printf("%d\n",sum);
20     }
21
22     return 0;
23 } 

解题思路(快速幂):

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

备忘录位运算:右移一位相当于除2.左移一位相当于乘2)

本题正式思路:while循环就是控制当b为0的时候循环结束。if语句就是使用按位与“&”,当两边都为1,表达式为1,这个是用来判断二进制数最后一位是否为1。如果为1,ans就要乘x^i,i为该位在二进制数中的位置。>>为位运算符,右移一位,即去掉已经计算过的部分。最后的a= a*a%kkk;用来标记记录x^2^i,循环i次即去掉了i位,当第i+1位为1时,sum就要乘x^2^i。~

 

时间: 2024-11-05 18:22:52

HDU2035 人见人爱A^B(快速幂)的相关文章

hdu2035 人见人爱A^B(快速幂取模)

题目链接:hdu 2035 人见人爱A^B 很早的时候做的一道题了,今天想想把他翻了出来,写篇文章来为不知道快速幂的同学做一个科普(请允许我吹一下牛逼).快速幂可以高效的计算幂运算.如果我们使用循环来计算的话,那么时间复杂度就是 O(n) ,使用快速幂的话就只用 O(log n).不要小看这么一点点,如果一个问题需要多次 的 幂运算的话,可能就会因为这一点小小的变化而超时. 快速幂介绍: 我们一直说快速幂快,那他究竟是在哪里快呢? 如果我们求解 2^k.可以将其表示为 x^n =( (x2)2.

杭电 2035 人见人爱A^B【快速幂取模】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2035 解题思路:这一题数据不大,可以用同余来做,也可以用快速幂来做 反思:定义成 #include<stdio.h> int quick_mod(int a,int b,int m) { int ans=1; while(b) { if(b&1) { ans=(ans*a)%m; b--; } b=b>>1; a=a*a%m; } return ans; } int main(

hdu2035【二分快速幂】

求AˆB取模.直接二分快速幂即可.比如9ˆ9=(9ˆ2)ˆ4 * 9,将B一直模2然后A自乘,复杂度long(n). 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 int quickpow(int a, int b, int mod) { 7 int ans = 1; 8 while(b) { 9 if(b & 1) { 10 ans

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

开始用了pow函数,6789^10000算出来时负的,应该是超了,但是网上搜了一下说c++的pow()是支持longlong的提供重载函数的https://blog.csdn.net/major_zhang/article/details/51456681,难道是结果超了??? 后来又发现循环内部变量用的int-- 再后来--循环*A;还是wa-- 重点在这:一直乘下去,结果会超,有一个数学规律:结果每次对1000取余,后三位不变,不懂个话,补一下数论知识(同余运算及其基本性质) http://

解题报告 之 HDU2035 人见人爱A^B

解题报告 之 HDU2035 人见人爱A^B 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 O

矩阵快速幂刷题系列

来源自http://blog.csdn.net/chenguolinblog/article/details/10309423 hdu 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5587    Accepted Submission(s): 4200 Problem Description A为一个方阵,则Tr

快速幂取模(POJ 1995)

http://poj.org/problem?id=1995 以这道题来分析一下快速幂取模 a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能 利用公式a*b%c=((a%c)*b)%c 每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然没有得到优化 由此可以用快速幂算法优化: http://www.cnblogs.com/qlky/p/5020402.html 再结合取模公式: (a + b) % p = (a % p

HDU 1757 A Simple Math Problem (矩阵快速幂)

[题目链接]:click here~~ [题目大意]: If x < 10 f(x) = x. If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10); 问f(k)%m的值. [思路]:矩阵快速幂,具体思路看代码吧,注意一些细节. 代码: #include<bits/stdc++.h> using namespace std; typedef long long LL; const

快速幂及快速幂取模

快速幂顾名思义,就是快速算某个数的多少次幂.其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提高.——bybaidu 快速幂可以用位运算这个强大的工具实现. 代码: 1 int pow(int a,int b) 2 { 3 int ans=1; 4 while(b!=0) 5 { 6 if(b&1) 7 ans*=a; 8 a*=a; 9 b>>=1; 10 } 11 return ans; 12 } 快速幂取模需要记住一个定理:积的取模等于取模积的取模:算法是蒙