• HDU 2035-人见人爱A^B(浅谈快速幂)


    人见人爱A^B

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 69289 Accepted Submission(s): 45915

    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

    题目链接

    这道题是HDU上的题目,可以用快速幂做,最后%1000就可以。AC代码

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main()
    {
    	ll fastpow(ll,ll);
    	ll a,b;
    	while(cin>>a>>b)
    	{
    		if(a==0&&b==0)
    		  break;
    		ll num=fastpow(a,b);
    	    cout<<(num%1000)<<endl; 
    	}
    	return 0;
    }
    ll fastpow(ll a,ll b)
    {
    	ll ans=1;
    	while(b!=0)
    	{
    		if(b&1)
    		  ans=(ans*a)%1000;//不要忘了随时对1e3取模
    		a=(a*a)%1000;
    		b>>=1;
    	}
    	return ans;
    }
    

    今天要讲的主要是快速幂,用3的9次方为例,按照一般算法的话我们要乘9次3才能得到,为了省时间,用快速幂算法,我们都知道任何一个数都可以用二进制数表示出来,例子中所说的9次方,可以写成3的8次方*3的一次方,也就是9可以写成1001,分别对应的是3的一次方,平方,四次方和八次方,这样,我们不断让3进行平方,如果遇到1则乘到ans里面,如果遇到0则继续平方,幂每次右移一位(等价于/2,向下取整),直到最后的幂等于0。返回ans即可。快速幂模板:

    ll fastpow(ll a,ll b)
    {
    	ll ans=1;
    	while(b!=0)
    	{
    		if(b&1)//判断这位是不是1
    		  ans*=a;
    		a*=a;//平方
    		b>>=1;//每次右移一位
    	}
    	return ans;
    }
    
  • 相关阅读:
    linux分析、诊断及调优必备的“杀器”之二
    浏览器被“hao123.3377.com”主页劫持的解决办法
    Nginx一个实现负载均衡的强大web server
    【百度之星
    c/c++ 参数传递
    【百度之星】-IP聚合
    百度之星-大搬家-递推
    IOS开发之Swift学习笔记
    【Leetcode】84. Largest Rectangle in Histogram 85. Maximal Rectangle
    【Leetcode】82. Remove Duplicates from Sorted List II
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294319.html
Copyright © 2020-2023  润新知