Submission #9311132
Source Code Expand
use mod_int::ModInt;
const MOD: usize = 1e9 as usize + 7;
fn main() {
let (r, w) = (std::io::stdin(), std::io::stdout());
let mut sc = IO::new(r.lock(), w.lock());
let n: usize = sc.read();
let c: usize = sc.read();
let a: Vec<usize> = sc.vec(n);
let b: Vec<usize> = sc.vec(n);
let max_b = *b.iter().max().unwrap();
let mut powers = vec![];
for i in 0..(max_b + 1) {
let mut power = vec![ModInt(1); c + 1];
for e in 1..(c + 1) {
power[e] = power[e - 1] * i;
}
powers.push(power);
}
let mut sums = vec![];
for e in 0..(c + 1) {
let mut sum = vec![ModInt(0); max_b + 2];
for i in 0..(max_b + 1) {
sum[i + 1] = sum[i] + powers[i][e];
}
sums.push(sum);
}
let mut dp = vec![ModInt(0); c + 1];
dp[0] = ModInt(1);
for i in 0..n {
let mut next = vec![ModInt(0); c + 1];
let a = a[i];
let b = b[i];
for cur in 0..(c + 1) {
for pay in 0..(c + 1) {
if cur + pay > c {
break;
}
let sum = sums[pay][b + 1] - sums[pay][a];
next[cur + pay] += dp[cur] * sum;
}
}
dp = next;
}
println!("{}", dp[c].0);
}
pub struct Combination {
fact: Vec<usize>,
inv_fact: Vec<usize>,
modulo: usize,
}
impl Combination {
pub fn new(max: usize, modulo: usize) -> Combination {
let mut inv = vec![0; max + 1];
let mut fact = vec![0; max + 1];
let mut inv_fact = vec![0; max + 1];
inv[1] = 1;
for i in 2..(max + 1) {
inv[i] = inv[modulo % i] * (modulo - modulo / i) % modulo;
}
fact[0] = 1;
inv_fact[0] = 1;
for i in 0..max {
fact[i + 1] = fact[i] * (i + 1) % modulo;
}
for i in 0..max {
inv_fact[i + 1] = inv_fact[i] * inv[i + 1] % modulo;
}
Combination {
fact: fact,
inv_fact: inv_fact,
modulo: modulo,
}
}
pub fn get(&self, x: usize, y: usize) -> ModInt<usize> {
assert!(x >= y);
let result =
self.fact[x] * self.inv_fact[y] % self.modulo * self.inv_fact[x - y] % self.modulo;
ModInt(result)
}
}
pub mod mod_int {
use super::MOD;
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
type Num = usize;
#[derive(Clone, Copy, Debug)]
pub struct ModInt<T: Copy + Clone>(pub T);
impl Add<ModInt<Num>> for ModInt<Num> {
type Output = ModInt<Num>;
fn add(self, rhs: ModInt<Num>) -> ModInt<Num> {
self + rhs.0
}
}
impl Add<Num> for ModInt<Num> {
type Output = ModInt<Num>;
fn add(self, rhs: Num) -> ModInt<Num> {
let mut t = rhs + self.0;
if t >= MOD {
t = t - MOD;
}
ModInt(t)
}
}
impl Sub<Num> for ModInt<Num> {
type Output = ModInt<Num>;
fn sub(self, rhs: Num) -> ModInt<Num> {
let rhs = if rhs >= MOD { rhs % MOD } else { rhs };
let value = if self.0 < rhs { self.0 + MOD } else { self.0 };
ModInt(value - rhs)
}
}
impl Sub<ModInt<Num>> for ModInt<Num> {
type Output = ModInt<Num>;
fn sub(self, rhs: ModInt<Num>) -> ModInt<Num> {
self - rhs.0
}
}
impl AddAssign<Num> for ModInt<Num> {
fn add_assign(&mut self, other: Num) {
*self = *self + other;
}
}
impl AddAssign<ModInt<Num>> for ModInt<Num> {
fn add_assign(&mut self, other: ModInt<Num>) {
*self = *self + other;
}
}
impl SubAssign<Num> for ModInt<Num> {
fn sub_assign(&mut self, other: Num) {
*self = *self - other;
}
}
impl SubAssign<ModInt<Num>> for ModInt<Num> {
fn sub_assign(&mut self, other: ModInt<Num>) {
*self = *self - other;
}
}
impl Div<Num> for ModInt<Num> {
type Output = ModInt<Num>;
fn div(self, rhs: Num) -> ModInt<Num> {
self * ModInt(rhs).pow(MOD - 2)
}
}
impl Div<ModInt<Num>> for ModInt<Num> {
type Output = ModInt<Num>;
fn div(self, rhs: ModInt<Num>) -> ModInt<Num> {
self / rhs.0
}
}
impl DivAssign<Num> for ModInt<Num> {
fn div_assign(&mut self, rhs: Num) {
*self = *self / rhs
}
}
impl DivAssign<ModInt<Num>> for ModInt<Num> {
fn div_assign(&mut self, rhs: ModInt<Num>) {
*self = *self / rhs
}
}
impl Mul<ModInt<Num>> for ModInt<Num> {
type Output = ModInt<Num>;
fn mul(self, rhs: ModInt<Num>) -> ModInt<Num> {
self * rhs.0
}
}
impl Mul<Num> for ModInt<Num> {
type Output = ModInt<Num>;
fn mul(self, rhs: Num) -> ModInt<Num> {
let t = (self.0 * rhs) % MOD;
ModInt(t)
}
}
impl MulAssign<Num> for ModInt<Num> {
fn mul_assign(&mut self, rhs: Num) {
*self = *self * rhs;
}
}
impl MulAssign<ModInt<Num>> for ModInt<Num> {
fn mul_assign(&mut self, rhs: ModInt<Num>) {
*self = *self * rhs;
}
}
impl ModInt<Num> {
pub fn pow(self, e: usize) -> ModInt<Num> {
let mut result = ModInt(1);
let mut cur = self;
let mut e = e;
while e > 0 {
if e & 1 == 1 {
result *= cur;
}
e >>= 1;
cur *= cur;
}
result
}
}
}
pub struct IO<R, W: std::io::Write>(R, std::io::BufWriter<W>);
impl<R: std::io::Read, W: std::io::Write> IO<R, W> {
pub fn new(r: R, w: W) -> IO<R, W> {
IO(r, std::io::BufWriter::new(w))
}
pub fn write<S: std::ops::Deref<Target = str>>(&mut self, s: S) {
use std::io::Write;
self.1.write(s.as_bytes()).unwrap();
}
pub fn read<T: std::str::FromStr>(&mut self) -> T {
use std::io::Read;
let buf = self
.0
.by_ref()
.bytes()
.map(|b| b.unwrap())
.skip_while(|&b| b == b' ' || b == b'\n' || b == b'\r' || b == b'\t')
.take_while(|&b| b != b' ' && b != b'\n' && b != b'\r' && b != b'\t')
.collect::<Vec<_>>();
unsafe { std::str::from_utf8_unchecked(&buf) }
.parse()
.ok()
.expect("Parse error.")
}
pub fn vec<T: std::str::FromStr>(&mut self, n: usize) -> Vec<T> {
(0..n).map(|_| self.read()).collect()
}
pub fn chars(&mut self) -> Vec<char> {
self.read::<String>().chars().collect()
}
}
Submission Info
| Submission Time |
|
| Task |
E - Children and Candies |
| User |
kenkoooo |
| Language |
Rust (1.15.1) |
| Score |
800 |
| Code Size |
7156 Byte |
| Status |
AC |
| Exec Time |
275 ms |
| Memory |
6396 KiB |
Judge Result
| Set Name |
Sample |
Subtask |
All |
| Score / Max Score |
0 / 0 |
400 / 400 |
400 / 400 |
| Status |
|
|
|
| Set Name |
Test Cases |
| Sample |
0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt |
| Subtask |
0_001, 0_003, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt |
| All |
0_000.txt, 0_001.txt, 0_002.txt, 0_003.txt, 0_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 2_017.txt, 2_018.txt, 2_019.txt, 2_020.txt, 2_021.txt, 2_022.txt, 2_023.txt, 2_024.txt, 2_025.txt, 2_026.txt, 2_027.txt, 2_028.txt, 2_029.txt |
| Case Name |
Status |
Exec Time |
Memory |
| 0_000.txt |
AC |
2 ms |
4352 KiB |
| 0_001.txt |
AC |
2 ms |
4352 KiB |
| 0_002.txt |
AC |
2 ms |
4352 KiB |
| 0_003.txt |
AC |
2 ms |
4352 KiB |
| 0_004.txt |
AC |
2 ms |
4352 KiB |
| 1_005.txt |
AC |
2 ms |
4352 KiB |
| 1_006.txt |
AC |
2 ms |
4352 KiB |
| 1_007.txt |
AC |
2 ms |
4352 KiB |
| 1_008.txt |
AC |
2 ms |
4352 KiB |
| 1_009.txt |
AC |
5 ms |
6396 KiB |
| 1_010.txt |
AC |
4 ms |
6396 KiB |
| 1_011.txt |
AC |
2 ms |
4352 KiB |
| 1_012.txt |
AC |
2 ms |
4352 KiB |
| 1_013.txt |
AC |
2 ms |
4352 KiB |
| 1_014.txt |
AC |
185 ms |
4352 KiB |
| 1_015.txt |
AC |
265 ms |
6396 KiB |
| 1_016.txt |
AC |
266 ms |
6396 KiB |
| 2_017.txt |
AC |
2 ms |
4352 KiB |
| 2_018.txt |
AC |
2 ms |
4352 KiB |
| 2_019.txt |
AC |
5 ms |
6396 KiB |
| 2_020.txt |
AC |
4 ms |
6396 KiB |
| 2_021.txt |
AC |
2 ms |
4352 KiB |
| 2_022.txt |
AC |
2 ms |
4352 KiB |
| 2_023.txt |
AC |
274 ms |
6396 KiB |
| 2_024.txt |
AC |
275 ms |
6396 KiB |
| 2_025.txt |
AC |
36 ms |
4352 KiB |
| 2_026.txt |
AC |
2 ms |
4352 KiB |
| 2_027.txt |
AC |
214 ms |
6396 KiB |
| 2_028.txt |
AC |
5 ms |
4352 KiB |
| 2_029.txt |
AC |
3 ms |
4352 KiB |