hdu1061-Rightmost Digit(附20循环的规律解法和附快速幂简单原理)
来源:互联网 发布:淘宝店铺付费推广 编辑:程序博客网 时间:2024/06/06 07:39
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
各个位上的值即为需要进行乘积的标志。
#include "stdio.h"#include "string.h"#include "stdlib.h"#include "math.h"#include "algorithm"#include "iostream"using namespace std;#define INT __int64int 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(附快速幂简单原理)
- hdu1061 Rightmost Digit 快速幂的简单应用
- hdu1061 Rightmost Digit 标准快速幂
- HDU1061 Rightmost Digit【快速模幂】
- hdu1061 Rightmost Digit 【快速幂模板】
- Rightmost Digit(HDU1061)
- Rightmost Digit(hdu1061)
- HDU1061-Rightmost Digit(快速幂取模)
- HDU1061:Rightmost Digit(快速幂取模)
- HDU1061-Rightmost Digit(快速幂取模)
- HDU1061 Rightmost Digit(快速幂取模)
- 【快速幂取模】HDU1061 Rightmost Digit
- HDU_ACM step 1.2.2 Rightmost Digit (解法:快速幂取余和快速幂取余的推导过程)
- HDU 1061 Rightmost Digit 【快速幂 Or 规律(瞎搞)】
- hdu1061 Rightmost Digit N的N次方
- HDU1061 - Rightmost Digit (二分幂取模)
- (解题报告)HDU1061---Rightmost Digit
- 开源项目Universal Image Loader for Android 说明文档 (3)
- C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示)
- 网站被K也是一种美丽
- 【开机提示ErrorloadingOS的两大解决方案】
- HDU/HDOJ 2102 A计划 广度优先搜索BFS
- hdu1061-Rightmost Digit(附20循环的规律解法和附快速幂简单原理)
- linux修改ulimit应该注意的
- Mono简介
- 6174问题
- SEO之四大要不得
- 抽象工厂的继续学习
- windows编程学习笔记
- linux下错误的捕获:errno和strerror的使用
- Core Audio APIS in Vista/Win7实现