http://acm.sgu.ru/problem.php?contest=0&problem=118

一开始是逐位逐位加求出digital root,结果超时了。
到网上看了一下,其实就是数n模9。可以证明如下:
设x = an* 10^(n-1) + ... + a1* 10^0 = an* (1+9)^(n-1) + ... + a1* (1+9)^0
所以x ≡ an + ... + a1 (mod 9),递推下去即可得证。当取模等于0时,应该取9.

#include <stdio.h>

inline 
int DigitSum(int n);

int main(void) {
    
int k, n;
    
int d[1001= {1};
    scanf (
"%d"&k);
    
int i, a;
    
while (k--) {
        scanf (
"%d"&n);
        
for (i = 0; i < n; ++i) {
            scanf (
"%d"&a);
            d[i
+1= DigitSum(DigitSum(a)*d[i]);
        }
        
int result = 0;
        
for (i = 1; i <= n; ++i) {
            result 
+= d[i];
        }
        printf (
"%d\n", DigitSum(result));
    }
    
return 0;
}

int DigitSum(int n) {
    
return (n%9? n%9 : 9;
}


posted on 2010-05-02 23:28 Willing 阅读(243) 评论(0)  编辑 收藏 引用 所属分类: ACM

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理