1163:Eddy's digital Roots
2015-08-27 21:05
232 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1163
方法:快速幂取余
思路:这道题如果直接暴力做,都不用想肯定会爆内存,因此肯定是要寻求其它方法解决。先考虑这样一道题,也就是原始的求数字根的题目,题目要求的是随意指定一个数字,求取其数字根,与本题唯一不同的就是不需要进行幂操作,详见1013题。在解决1013时,可以按照题目要求模拟,但是还有一种捷径,那就是对9取余,就是结果,但是要注意一点,如果是9的整数倍,比如27,取余就会变成0,这意味着这种情况要特殊处理,也就是说凡是9的倍数答案都应该是9,这样这个题就比较清晰了,可以采用快速幂取余的思路快速对9取余,就是答案。
难点:想到对9取余以及二分求幂的算法。
方法:快速幂取余
思路:这道题如果直接暴力做,都不用想肯定会爆内存,因此肯定是要寻求其它方法解决。先考虑这样一道题,也就是原始的求数字根的题目,题目要求的是随意指定一个数字,求取其数字根,与本题唯一不同的就是不需要进行幂操作,详见1013题。在解决1013时,可以按照题目要求模拟,但是还有一种捷径,那就是对9取余,就是结果,但是要注意一点,如果是9的整数倍,比如27,取余就会变成0,这意味着这种情况要特殊处理,也就是说凡是9的倍数答案都应该是9,这样这个题就比较清晰了,可以采用快速幂取余的思路快速对9取余,就是答案。
难点:想到对9取余以及二分求幂的算法。
#include <cstdio> using namespace std; int powermod(int a,int b,int c) { int ans = 1; while(b!=0) { if(b%2 == 1) { ans *= a; ans %= c; } b /= 2; a *= a; a %= c; } return ans; } int main() { int n; while(~scanf("%d",&n)) { if(n == 0) break; if(powermod(n,n,9) == 0) printf("9\n"); else printf("%d\n",powermod(n,n,9)); } }
相关文章推荐
- 面向对象风格的线程类封装
- UFLDL教程(五)之self-taught learning
- 二叉查找树与平衡二叉树
- hive on spark on yarn
- ASP.Net的两种开发模式
- 1002.A+B for Polynomials (25) 合并同类项
- UVa 1585 Score
- 多线程基础
- Linux学习笔记------讲9.2.4 Linux如何支持NTFS文件系统???
- POJ1364 King(差分约束 SPFA)
- Python数据结构:序列(列表[]、元组())与映射(字典{})语法总结
- VC 常用快捷键
- Junit(1)在Eclipse中使用JUnit4进行单元测试
- 软件开发的核心基本能力是理解和表达事物的能力
- Android不编译某个模块
- Metasploit(四)--Msfpayload命令
- [C++11 并发编程] 13 使用期望等待一次性事件
- UVa 1584 Circular Sequence
- Photoshop图像处理算法—对比度调整(老版功能)
- Android中Preference的使用以及监听事件分析