1061 快速幂取模


 HDU 1061 Rightmost Digit
分类: ACM 算法 2011-12-17 17:37 749人阅读 评论(2) 收藏 举报
integeroutputinputeach算法c

Problem Description
Given a positive integer N, you should output the most right digit of N^N.

Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains a single positive integer N(1<=N<=1,000,000,000).

Output
For each test case, you should output the rightmost digit of N^N.

Sample Input
2
3
4

Sample Output
7
6

Hint

In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7.
In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.

题意:
求n^n模10
代码:
[cpp] view plaincopy
#include<stdio.h>

int exp_mod(int a,unsigned int n,int b)
{
int t;
if(n==0||n==1)
return n==0?1:a;
t=exp_mod(a,n/2,b);
t=t*t;
if(n%2==1)t=t*a;
return t%b;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long n;
scanf("%lld",&n);
printf("%d\n",exp_mod(n%10,n,10));
}
return 0;
}

分析:
代码是在网上找的模版,第一次做是想找规律的可是实在是太繁琐勒(其实是我懒= =! ),就上网看看有没有更简单的方法,才知道这样的题有模版,就是快速幂取模.果断背下来....
下面是我经过在网上找的解析:
快速幂取模就是在O(logn)内求出a^n mod b的值。算法的原理是ab mod c=(a mod c)(b mod c)mod c

1061 快速幂取模

时间: 2024-11-09 00:35:26

1061 快速幂取模的相关文章

HDU - 1061 - Rightmost Digit (快速幂取模!)

Rightmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 34329    Accepted Submission(s): 13091 Problem Description Given a positive integer N, you should output the most right digit of

快速幂取模总结

大白书上说的是模运算..而且给出了递归版的代码..我觉得还是非递归的好..而且加上了位运算,速度更快.下面是快速幂取模模板. 模板: LL quickpow(LL n, LL m, int mod) { LL ans=1; while(m>0) { if(m&1) ans=ans*n%mod; m=m >> 1; n=n*n%mod; } return ans; } 练习题目: HDU 1061 hdu 2035 快速幂取模总结

快速幂取模(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

快速幂及快速幂取模

快速幂顾名思义,就是快速算某个数的多少次幂.其时间复杂度为 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 } 快速幂取模需要记住一个定理:积的取模等于取模积的取模:算法是蒙

关于快速幂取模

今天看算法书的时候,看到一道关于快速幂取模的题,心想好像不难,便写了一下,发现我的渣渣代码写的比正常的O(N)复杂度还要慢(天知道我怎么做到的T_T),渣渣代码如下: 1 public static long fastMi(long x,long n){ 2 if(n==1){ 3 return x; 4 } 5 if(n%2==0){ 6 return fastMi(x,n/2)*fastMi(x,n/2); 7 }else{ 8 return fastMi(x,n/2)*fastMi(x,n

快速幂取模算法

什么是快速幂? 快速幂应当是快速幂取模的简称 对于一般的求幂算法,求$a^b\,\bmod\,m$,即使用循环b次的方法,复杂度是$O(b)$的,当b很大的时候,这种算法就会显得十分缓慢. 快速幂是基于以下明显的事实: $${a^b} \equiv {(a^2)^{\frac{b}{2}}} \pmod{m}\quad b\ is\ even$$ $${a^b} \equiv {(a^2)^{\frac{b}{2}}*a} \pmod{m}\quad b\ is\ odd$$ 那么我们得到这样一

快速幂取模

参考文章来源:Reait  Home(http://www.reait.com/blog.html) 转载请注明,谢谢合作. 在Miller Rabbin测试素数,就用到了快速幂取模的思想.这里总结下.求a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能 算法1:利用公式a*b%c=((a%c)*b)%c,这样每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然没有得到优化 代码如下: 01.int modexp_simpl

快速幂取模和快乘取模

一.快速幂取模概念 快速幂取模,顾名思义,就是快速的求一个幂式的模(余),比如a^b%c,快速的计算出这个式子的值. 在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法. 二.快速幂取模算法实现 1)很容易能想到,循环b次,每次乘a,最后对c取余就可以了. int ans = 1; for(int i = 1; i<=b; i++) { ans = ans * a; } ans = ans % c; 这个朴素算法的问题是: 1.如果a和b

HDU 4365 正方形格子涂色中心对称轴对称的涂法有多少种-思维-(矩阵坐标关系&amp;快速幂取模)

题意:n*n的格子,涂色,有k种颜料,必须满足旋转任意个90度和翻转之后图片的样子不变,现在已经有m个格子涂过色了,问还有多少种涂法满足上述条件. 分析: 满足上述对称条件,那么涂色的种类问题我们可以放在正方形的一个角来做,因为一个角确定了其他角的颜色也就确定了. 以左上角的下半角为例.共有1+2+....+(n+1)/2个格子,然后记录涂过色的格子对应到这个三角形里的格子数目,用tot来记录,即每输入一个涂过色的格子的坐标我们就在这个三角形里找与之对应的坐标,用vis[][]数组标记是否已经计