zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    ES6 class -- Class 的基本语法
    ES6 Promise --回调与Promise的对比、信任问题、错误处理、Promise的状态、以及Promise对象的常用方法
    移动端调试,手机缓存清不掉
    JAR 介绍-百度百科
    一致性哈希的基本概念
    Java线程池的配置
    java多线程面试题整理及答案(2018年)
    Java多线程面试题整理
    IntelliJ Idea 常用快捷键
    RESTful规范
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294319.html
Copyright © 2011-2022 走看看