hdu1061-Rightmost Digit(附20循环的规律解法和附快速幂简单原理)
2013-06-09 15:45
323 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1061
1.快速幂实现a^N
求3^999(a=3,N=999):3 ^ 999 = 3 * 3 * 3 * … * 3,直接乘要做998次乘法。
快速幂方法实质使用了二分法进行时间优化:
tmp+ = tmp-* a-;
3 ^ 1 = 3* 1
3 ^ 2 = (3 ^ 1)*
(3 ^ 1)
3 ^ 4 = (3 ^ 2) *(3 ^ 2)
…………
3 ^ 256 = (3 ^ 128) * (3 ^ 128)
3 ^ 512 = (3 ^ 256) * (3 ^ 256)
==>
3 ^ 999
= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3
只做16次乘法。
将999转为2进制数:1111100111
1 1 1 1 1 0 0 1 1 1
512 256 128 64 32 0 0 4 2 1
各个位上的值即为需要进行乘积的标志。
下面是发现没20个数据存在循环,之前没有将num[ 0] 赋值为0 ,总是WA,还怀疑规律是不是错了,但是突然发现20的倍数mod20会为0
1.快速幂实现a^N
求3^999(a=3,N=999):3 ^ 999 = 3 * 3 * 3 * … * 3,直接乘要做998次乘法。
快速幂方法实质使用了二分法进行时间优化:
tmp+ = tmp-* a-;
3 ^ 1 = 3* 1
3 ^ 2 = (3 ^ 1)*
(3 ^ 1)
3 ^ 4 = (3 ^ 2) *(3 ^ 2)
…………
3 ^ 256 = (3 ^ 128) * (3 ^ 128)
3 ^ 512 = (3 ^ 256) * (3 ^ 256)
==>
3 ^ 999
= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3
只做16次乘法。
将999转为2进制数:1111100111
1 1 1 1 1 0 0 1 1 1
512 256 128 64 32 0 0 4 2 1
各个位上的值即为需要进行乘积的标志。
#include "stdio.h" #include "string.h" #include "stdlib.h" #include "math.h" #include "algorithm" #include "iostream" using namespace std; #define INT __int64 int Pow( INT n ) { int temp = n % 10 ; int ans = 1 ; while( n ) { if( n % 2 == 1 ) { n-- ; ans *= temp; ans %= 10 ; } else { n /= 2 ; temp *= temp ; temp %= 10 ; } ans %= 10 ; } return ans ; } int main() { INT n ; int Case ; cin >> Case ; while( Case-- ) { cin >> n ; cout << Pow( n ) << endl ; } return 0; }
下面是发现没20个数据存在循环,之前没有将num[ 0] 赋值为0 ,总是WA,还怀疑规律是不是错了,但是突然发现20的倍数mod20会为0
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main() { __int64 n ; int a , b , num[ 50 ] ; int i ; num[ 0 ] = 0 ; for(i = 1 ; i <= 20 ; i++ ) { a = i ; b = 1 ; while ( a-- ) { b = b * i % 10 ; } num[ i ] = b ; } int Case ; cin >> Case; { while( Case-- ) { cin >> n ; n = n % 20 ; // cout << n << endl ; cout << num[ n ] << endl ; } } return 0 ; }
相关文章推荐
- hdu1061-Rightmost Digit(附20循环的规律解法和附快速幂简单原理)
- hdu1061-Rightmost Digit(附快速幂简单原理)
- hd 1061 Rightmost Digit 规律21 一循环 对20取余
- HDU 1061 Rightmost Digit(简单快速幂)
- HDOJ 1061 Rightmost Digit(循环问题)
- HDU1061 Rightmost Digit 快速幂 C语言
- Rightmost Digit(简单数论_幂取模)
- hdu1061_Rightmost Digit
- ACM课-Rightmost Digit-规律
- HDU1061:Rightmost Digit(快速幂取模)
- (解题报告)HDU1061---Rightmost Digit
- hdu1061 rightmost digit
- YT02-简单数学课堂题-1001 Rightmost Digit-(5.31日-烟台大学ACM预备队解题报告)
- Rightmost Digit(hdu1061)
- hdu1061 Rightmost Digit 标准快速幂
- Rightmost Digit HDU - 1061 (快速幂问题)
- Rightmost Digit(HDU1061)
- HDU-#1061 Rightmost Digit(规律、分治、快速幂取模)
- HDU1061-Rightmost Digit(高速功率模)
- HDU1061:Rightmost Digit