您的位置:首页 > 其它

HDOJ 1163 Eddy's digital Roots 九余数定理+简单数论

2014-11-18 10:47 351 查看
我在网上看了一些大牛的题解,有些知识点不是太清楚, 因此再次整理了一下。

转载链接:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: