码迷,mamicode.com
首页 > 其他好文 > 详细

hrbust1140 数字和问题

时间:2017-07-26 23:34:24      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:分析   std   include   数据   name   img   int   alt   open   

题目:

定义一种操作为:已知一个数字,对其各位数字反复求和,直到剩下的数是一位数不能求和为止。
例如:数字2345,第一次求和得到2 + 3 + 4 + 5 = 14,再对14的各位数字求和得到1 + 4 = 5,得到5将不再求和。
现在请你求出对ab进行该操作后,最终得到的数字是什么。
 
数据范围:包含两个数字a(0 <= a <= 2000000000)和b(1 <= b <= 2000000000)

链接:https://cn.vjudge.net/problem/HRBUST-1140

分析:

1.数据太大,但是结果范围是( 0 <= res <= 9 )。

2.有个结论:数字和公式:abcd % 9 = n % 9。(n = a + b + c + d)。

简单证明:

(a + b + c + d) % 9
= (999a + 99b + 9*c + a + b + c + d) % 9
= abcd % 9

3.使用快速幂取余 求 ab%9 。

4.注意:当a==0时,res=0 。

代码:

技术分享
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long

ll quickpow(ll a,ll b,ll k)
{
    ll res=1;
    while(b)
    {
        if(b&1) res=(a*res)%k;
        a=(a*a)%k;
        b>>=1;
    }
    return res;
}

int main()
{
    ll a,b,k=9;
    while(cin>>a>>b)
    {
        ll res=quickpow(a,b,k)%k;
        if(a==0) res=0;
        else if(res==0) res=9;
        cout<<res<<endl;
    }
    return 0;
}
View Code

 

hrbust1140 数字和问题

标签:分析   std   include   数据   name   img   int   alt   open   

原文地址:http://www.cnblogs.com/tristatl/p/7241992.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!