题意
定义f(n)为n各位数字之和,如果n是各位数,则n个数根是f(n),否则为f(n)的数根
现在给出n个Ai,求出A1*A2*…*AN + A1*A2*…*AN-1 + … + A1*A2 + 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 }