sgu 118

题意

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

 1 // File Name: 118.cpp

 2 // Author: Missa

 3 // Created Time: 2013/3/19 星期二 13:33:58

 4 

 5 #include<iostream>

 6 #include<cstdio>

 7 #include<cstring>

 8 #include<algorithm>

 9 #include<cmath>

10 #include<queue>

11 #include<stack>

12 #include<string>

13 #include<vector>

14 #include<cstdlib>

15 #include<map>

16 #include<set>

17 using namespace std;

18 #define CL(x,v) memset(x,v,sizeof(x));

19 #define R(i,st,en) for(int i=st;i<en;++i)

20 #define LL long long

21 #define inf 0x3f3f3f3f

22 

23 const int maxn = 1e3+5;

24 int a[maxn];

25 int n;

26 

27 int main()

28 {

29     int t;

30     scanf("%d",&t);

31     while(t--)

32     {

33         scanf("%d",&n);

34         R(i,0,n)

35             scanf("%d",&a[i]);

36         int sum = (a[n-1])%9;

37         for(int i = n-2 ;i >= 0; -- i)

38         {

39             sum = ((a[i] % 9) * ((1+sum) % 9)) % 9;

40         }

41         printf("%d\n",sum?sum:9);

42     }

43     return 0;

44 }

 

你可能感兴趣的:(sgu 118)