package main import . "fmt" const M = 1e9+7 func main() { var t int Scan(&t) for ; t > 0 ; t-- { var n int Scan(&n) a := make([]int, n) for i := range a { Scan(&a[i]) } for len(a) > 1 { x,y := a[0], a[1] a[1] = ((x+y)%M+x*y%M)%M a = a[1:] } Println(a[0]) } } /* 考察 a b c d e f g (a+b)+(a*b) c d e f g (a+ab+b) c d e f g ((a+ab+b)+c)+((a+ab+b)*c) d e f g (a+ab+b+c+ac+abc+bc) (a+b)+(a*b) c d e f g (a+ab+b) (c+d)+(c*d) e f g (a+ab+b) (c+cd+d) e f g ((a+ab+b)+(c+cd+d)+(a+ab+b)*(c+cd+d)) e f g ((a+ab+b+c+cd+d)+(ac+abc+bc+acd+abcd+bcd+ad+abd+bd)) e f g (a+b+c+d+ab+ac+ad+bc+bd+cd+abc+abd+acd+bcd+abcd) e f g N-1回の操作後は操作の順序に関係なく 1~N個の積の組み合わせ総当たりの和になる 何度操作しても同じ値になるのであれば操作後の値は期待値と等しくなる(X+X+X+X+X)/5=Xになるのは当然 考察ミスでのWAが怖いなー でも数学苦手だし… */