module Main; import BinaryHeap; import BoolArray; import CPLib.Arithmetic; import CPLib.DSegtree; import CPLib.Graph; import CPLib.IO; import CPLib.LDSegtree; import CPLib.UnionFind; import CPLib.ZP; import HashMap; import HashSet; type Z = ZP P1000000007; main : IO () = ( let cN = *read_i; let cS = *read_i; let cK = *read_i; let cX = cS - (cN*(cN-1))/2*cK; if cX < 0 { 0.to_string.println }; let dp = fill(cN + 1, fill(cX + 1, zp(0) : Z)); let dp = dp[0][0].iset(zp(1)); let dp = range(1, cN+1).fold(dp, |n, dp| range(0, cX+1).fold(dp, |x, dp| let c = cN - (n - 1); let v = if x >= c { dp[n-1][x].iget + dp[n][x-c].iget } else { dp[n-1][x].iget }; dp[n][x].iset(v) // dp[n][x] = dp[n-1][x] + dp[n-1][x-c] + dp[n-1][x-2c] + ... // = dp[n-1][x] + dp[n][x-c] if x >= c, // = dp[n-1][x] ) ); dp[cN][cX].iget.@value.to_string.println );