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

sgu 118 Digital root

时间:2015-08-16 12:01:55      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:

The digital root (also repeated digital sum) of a non-negative integer is the (single digit) value obtained by an iterative process of summing digits

规律题

题意

  定义f(n)为n各位数字之和,如果n是各位数,则n个数根是f(n),否则为f(n)的数根

  现在给出n个Ai,求出A1*A2*…*AN + A1*A2*…*AN-1 + … + A1*A+ A1 这个式子的数根

  多组数据

分析

  首先,要知道这样一个结论:

    任何一个整数模9同余于它的各数位上数字之和

 

  具体证明过程如下:

  设自然数N=a[n]a[n-1]…a[0],其中a[0],a[1]、…、a[n]分别是个位、十位、…上的数字

  再设M=a[0]+a[1]+…+a[n]

  求证:N≡M(mod 9).


   证明:
     ∵ N=a[n]a[n-1]…a[0]=a[n]*10^n+a[n-1]*10^(n-1)+…+a[1]*10+a[0].
    又∵ 1≡1(mod 9),
        10≡1(mod 9),
        10^2≡1(mod 9),
          … 
        10^n≡1(mod 9).
    上面这些同余式两边分别同乘以a[0]、a[1]、a[2]、…、a[n],再相加得:
      a[0]+a[1]*10+…+a[n]*10^n≡(a[0]+a[1]+…+a[n])(mod 9),
                    即 N≡M(mod 9),得证。

 

结论:如果x本身为0,digitalRoot(x)  ,如果x>0 ,digitalRoot(x)=(x+8)%9+1

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define LL long long
int a[1010];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)scanf("%d",&a[i]);
        LL ans=((LL)a[n-1]+8)%9+1;
        for(int i=n-2;i>=0;i--)
        {
            ans=((ans+1)*a[i]+8)%9+1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

sgu 118 Digital root

标签:

原文地址:http://www.cnblogs.com/kylehz/p/4733719.html

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