HDU 2035-人见人爱A^B(乘方取模)

人见人爱A^B

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 22425    Accepted Submission(s): 15667

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

第一发 数论,问题描述:求 a^n%m

最简单的思想是用循环分部取余,在n很小的情况下是可以过的,如下
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <vector>
#include <string>
#include <map>
#include <queue>
using namespace std;
int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        if(!a&&!b)break;
        int p=1;
        for(int i=1;i<=b;i++)
            p=p*a%1000;
        cout<<p<<endl;
    }
    return 0;
}

但是当n很大的时候这个循环就要挂掉了,所以要用到数学方法。对指数n进行二分,就会有

a^n%m= a^(n/2)%m n为偶数

a^(n/2)%m * a%m n为奇数

非递归 代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <vector>
#include <string>
#include <map>
#include <queue>
using namespace std;
#define LL long long
LL multimod(LL a,LL n,LL m)
{
    LL ans=1,tem=a;
    while(n)
    {
        if(n&1)//判断是否为奇数
            ans=ans*tem%m;
        tem=tem*tem%m;
        n/=2;
    }
    return ans;
}
int main()
{
    LL a,b;
    while(cin>>a>>b)
    {
        if(!a&&!b)break;
        cout<<multimod(a,b,1000)<<endl;
    }
    return 0;
}
时间: 2024-10-13 09:49:53

HDU 2035-人见人爱A^B(乘方取模)的相关文章

hdu 3221 Brute-force Algorithm(快速幂取模,矩阵快速幂求fib)

http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序,问funny函数调用了多少次. 我们定义数组为所求:f[1] = a,f[2] = b, f[3] = f[2]*f[3]......f[n] = f[n-1]*f[n-2].对应的值表示也可为a^1*b^0%p,a^0*b^1%p,a^1*b^1%p,.....a^fib[n-3]*b^fib[n-2]%p.即a,b的指数从n=3以后与fib数列

HDU 1212 Big Number(C++ 大数取模)(java 大数类运用)

Big Number 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1212 --每天在线,欢迎留言谈论. 题目大意: 给你两个数 n1,n2.其中n1 很大很大,n1%n2的值. 知识点: ①秦九韶公式:例:1314= ((1*10+3)*10+1)*10+4 ②(a*b)%c == (a%c)*(b%c) .(a+b)%c == (a%c)+(b%c) . 思路: 每步取模即可. C++ AC代码: 1 #include <iostream>

hdu 1452 Happy 2004 (快速幂+取模乘法逆元)

Problem Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29).Take X = 1 for an example. The positive integer divisors of

HDU 5832 A water problem(取模~)—— 2016中国大学生程序设计竞赛 - 网络选拔赛

传送门 A water problem Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 60    Accepted Submission(s): 37 Problem Description Two planets named Haha and Xixi in the universe and they were created wit

HDU - 3003 - Pupu (快速幂取模!)

Pupu Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1133    Accepted Submission(s): 445 Problem Description There is an island called PiLiPaLa.In the island there is a wild animal living in it

HDU 4945 2048(dp+快速幂取模)

题目大意:给你一个序列让你求出有多少种组合可以得到2048.结果要对998244353取余. 解题思路:求出不能满足条件的方案数,然后用总的减去不满足的然后乘上其他无关的组合方式,比如3,5这些数字是在构成2048的过程中无用的,所以乘上这些组合出来的情况. dp[i][j]表示取到第i个2^i的数,其最大的和在j*2^i至(j+1)*2^i-1的方案数. 所以有dp[i][j] += ((dp[i-1][k]+dp[i-1][k+1])*use[i][j-k/2])%mod.表示在i位置时最大

hdu 2035 人见人爱A^B

人见人爱A^B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 34306    Accepted Submission(s): 23290 Problem Description 求A^B的最后三位数表示的整数. 说明:A^B的含义是“A的B次方” Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A

hdu 2035 人见人爱A^B (java)

问题: 此题需要用到大数来储存,但int还是能装下输入的n,m所以并没必要用BigInteger来装. 在开始用BigInteger装n时,即使将0转化成BigInteger型,用于判断0的if语句并没有效果,原因不明. 一些用于处理大数的函数: Ⅰ基本函数: 1.valueOf(parament); 将参数转换为制定的类型 比如 int a=3; BigInteger b=BigInteger.valueOf(a); 则b=3; String s="12345"; BigIntege

HDU 2932 Extraordinarily Tired Students (暴力+取模还是很强大的)

题目链接:HDU 2932 Extraordinarily Tired Students 题意:给出N个学生的状态,(a,b,c).a表示a分钟这醒着,b表示b分钟睡着,c表示刚开始是重周期(a+b)分钟的第c分钟开始.求第几分钟,所有的学生都没有睡觉.其中每个学生在睡觉前看一下是否睡觉的人数(包括他自己)比醒着的人数大,若是就睡觉,反之则不睡觉. 数据很小,暴力之,假设所有学生都没睡觉的时间不超过1000000,发现还可以更小. AC代码; #include <stdio.h> #inclu