package main import . "fmt" import . "os" import bf "bufio" func main() { rd := bf.NewReader(Stdin) table := make([]int, 21) table[0] = 0 // 0のときは 0^0! = 0^1 = 0 for i := 1; i < len(table); i++ { a := i for j := 1; j <= i; j++ { s := 1 for k := 0; k < j; k++ { s = min(s*a, 1e9+10) } a = s } table[i] = a } println(Sprint(table)) var n int Fscan(rd,&n) m := 1 for i := 0; i < n; i++ { var a int Fscan(rd,&a) m = min(m*table[min(a,20)],1e9+10) } // 0のとき-1にするの忘れてた // mが0のときでしたね… var ans int if m != 0 { ans = int(1e9+7)%m } else { ans = -1 } Println(ans) } /* 考察 数日間、TLE解法しか思いつかず 何か高速に階乗の除法なりを求める数学的な方法でもあるのかググってもよくわからずを過ごした… 最終的に思い至ったのが、『誤読しているんじゃないか?』 そう、事実、”誤読”だった・・・ 1e9+7"で"割った余りを求めるのだとずっと思っていた… 違った 1e9+7"を"割った余りを求める問題だった…つまり1e9+8以上になったら1e9+7が出力すべき値… サンプルの出力例には当初から違和感を感じてたけど、その違和感について深く考えず考察つづけたのもいけなかった */