HDOJ 1163 Eddy's digital Roots 九余数定理+简单数论
我在网上看了一些大牛的题解,有些知识点不是太清楚, 因此再次整理了一下。
转载链接:
http://blog.csdn.net/iamskying/article/details/4738838
http://www.2cto.com/kf/201405/297531.html
题目描述:
求n^n次的digital root(数根),例如root(67)=6+7=root(13)=1+3=4;
一类解法:
求解思路:
现在分析一个问题,假设将十位数为a,个位数为b的一个整数表示为ab,则推导得
ab*ab = (a*10+b)*(a*10+b) = 100*a*a+10*2*a*b+b*b
根据上式可得:root(ab*ab) = a*a+2*a*b+b*b = (a+b)*(a+b);[公式一]
同理也可证得:root(ab*ab*ab) = (a+b)*(a+b)*(a+b);[公式二]
可以看出,N个相同整数的乘积总值的树根 = 每一项元素的树根的乘积
再设另外一个整数cd,且cd!=ab
ab*cd = (a*10+b)*(c*10+d) = 100*a*c+10*(a*d+b*c)+b*d
根据上式可得:root(ab*cd) = a*c+a*d+b*c+b*d = (a+b)*(c+d);[公式三]
可见,对于两个不相同整数也成立。
最后将上面证得的结果一般化:
N个整数的乘积总值的数根 = 每个项元素的数根的乘积
提示:本题只需根据[公式三] 即可AC.
二类解法:
九余数定理:
一个数字n的树根 == n%9(n == 0 则为9)
运用9余数定理 + 公式3 我们就可以很简单的写出程序
#include <iostream>> using namespace std; int main() { int n; while( cin >> n, n) { int sum = 1; for(int i=1; i<=n; i++) { sum = (n*sum)%9; if(!sum) sum = 9; } cout << sum << endl; } return 0; }