数学/找规律/sgu 118 Digital root

题意

  定义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),得证。

 

  有了这个性质就容易解决本题了

  在计算过程中,可以不断mod 9,因为我们知道有这样两个性质:

    (A+B)mod C = ((A mod C) + (B mod C))mod C   
    (AB)mod C = ((A mod C)×(B mod C)) mod C

 还要注意,如果余数为0,则输出9

 

Accepted Code

 1 /*
 2     PROBLEM:sgu118
 3     AUTHER:Rinyo
 4     MEMO:数学 找规律
 5 */
 6 #include<cstdio>
 7 #include<cstring>
 8 int a[1030];
 9 int main()
10 {
11     int tot;
12     scanf("%d",&tot);
13     while (tot--)
14     {
15         int n;
16         scanf("%d",&n);
17         memset(a,0,sizeof(a));
18         for (int i=1;i<=n;i++) scanf("%d",&a[i]);
19         int sum=1;
20         for (int i=n;i>1;i--) {sum*=a[i]%9;sum++;sum%=9;}
21         sum*=a[1]%9;sum%=9;
22         printf("%d\n",sum?sum:9);
23     }
24     return 0;
25 }

 

转载于:https://www.cnblogs.com/Rinyo/archive/2012/12/20/2826755.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值