Submission #6217803
Source Code Expand
#![allow(unused_imports, unused_macros, dead_code)]
macro_rules! min {
($x:expr) => ($x);
($x:expr, $($ys:expr),*) => {{
let t = min!($($ys),*);
if $x < t { $x } else { t }
}}
}
macro_rules! max {
($x:expr) => ($x);
($x:expr, $($ys:expr),*) => {{
let t = max!($($ys),*);
if $x > t { $x } else { t }
}}
}
macro_rules! ewriteln {
($($args:expr),*) => { let _ = writeln!(&mut std::io::stderr(), $($args),*); };
}
macro_rules! trace {
($x:expr) => { ewriteln!(">>> {} = {:?}", stringify!($x), $x) };
($($xs:expr),*) => { trace!(($($xs),*)) }
}
macro_rules! put {
($x:expr) => { println!("{}", $x) };
($x:expr, $($xs:expr),*) => { print!("{} ", $x); put!($($xs),*) }
}
const M: i64 = 1_000_000_007;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
struct ModInt { res: i64, md: i64 }
impl ModInt {
fn new(res: i64, md: i64) -> Self {
ModInt { res: res, md: md }
}
fn inv(self) -> Self {
fn exgcd(r0: i64, a0: i64, b0: i64, r: i64, a: i64, b: i64)
-> (i64, i64, i64) {
if r > 0 {
exgcd(r, a, b, r0 % r, a0 - r0 / r * a, b0 - r0 / r * b)
} else {
(a0, b0, r0)
}
}
let (a, _, r) = exgcd(self.res, 1, 0, self.md, 0, 1);
if r != 1 { panic!("{:?} has no inverse!", self); }
ModInt::new(((a % self.md) + self.md) % self.md, self.md)
}
fn pow(self, n: i64) -> Self {
if n < 0 {
self.pow(-n).inv()
} else if n == 0 {
ModInt::new(1, self.md)
} else if n == 1 {
self
} else {
let mut x = (self * self).pow(n / 2);
if n % 2 == 1 { x *= self }
x
}
}
}
impl std::fmt::Display for ModInt {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.res)
}
}
impl std::ops::Neg for ModInt {
type Output = Self;
fn neg(self) -> Self {
if self.res == 0 { return self }
ModInt { res: self.md - self.res, md: self.md }
}
}
impl std::ops::Add<i64> for ModInt {
type Output = Self;
fn add(self, other: i64) -> Self {
let res = if self.res + other >= self.md {
self.res + other - self.md
} else {
self.res + other
};
ModInt { res: res, md: self.md }
}
}
impl std::ops::Add for ModInt {
type Output = Self;
fn add(self, other: ModInt) -> Self {
self + other.res
}
}
impl std::ops::Add<ModInt> for i64 {
type Output = ModInt;
fn add(self, other: ModInt) -> ModInt {
other + self
}
}
impl std::ops::AddAssign<i64> for ModInt {
fn add_assign(&mut self, other: i64) {
self.res += other;
if self.res >= self.md {
self.res -= self.md;
}
}
}
impl std::ops::AddAssign for ModInt {
fn add_assign(&mut self, other: ModInt) {
*self += other.res;
}
}
impl std::ops::Sub<i64> for ModInt {
type Output = Self;
fn sub(self, other: i64) -> Self {
let res = if self.res < other {
self.res + self.md - other
} else {
self.res - other
};
ModInt { res: res, md: self.md }
}
}
impl std::ops::Sub for ModInt {
type Output = Self;
fn sub(self, other: ModInt) -> Self {
self - other.res
}
}
impl std::ops::Sub<ModInt> for i64 {
type Output = ModInt;
fn sub(self, other: ModInt) -> ModInt {
-other + self
}
}
impl std::ops::SubAssign<i64> for ModInt {
fn sub_assign(&mut self, other: i64) {
if self.res < other {
self.res = self.res - other + self.md;
} else {
self.res -= other;
}
}
}
impl std::ops::SubAssign for ModInt {
fn sub_assign(&mut self, other: ModInt) {
*self -= other.res;
}
}
impl std::ops::Mul<i64> for ModInt {
type Output = Self;
fn mul(self, other: i64) -> Self {
ModInt { res: (self.res * other) % self.md, md: self.md }
}
}
impl std::ops::Mul for ModInt {
type Output = Self;
fn mul(self, other: ModInt) -> Self {
self * other.res
}
}
impl std::ops::Mul<ModInt> for i64 {
type Output = ModInt;
fn mul(self, other: ModInt) -> ModInt {
other * self
}
}
impl std::ops::MulAssign<i64> for ModInt {
fn mul_assign(&mut self, other: i64) {
self.res = (self.res * other) % self.md;
}
}
impl std::ops::MulAssign for ModInt {
fn mul_assign(&mut self, other: ModInt) {
*self *= other.res;
}
}
impl std::ops::Div<i64> for ModInt {
type Output = Self;
fn div(self, other: i64) -> Self {
self * ModInt::new(other, self.md).inv()
}
}
impl std::ops::Div for ModInt {
type Output = Self;
fn div(self, other: ModInt) -> Self {
self * other.inv()
}
}
impl std::ops::Div<ModInt> for i64 {
type Output = ModInt;
fn div(self, other: ModInt) -> ModInt {
other.inv() * self
}
}
impl std::ops::DivAssign for ModInt {
fn div_assign(&mut self, other: ModInt) {
self.res = (self.res * other.inv().res) % self.md;
}
}
impl std::ops::DivAssign<i64> for ModInt {
fn div_assign(&mut self, other: i64) {
*self /= ModInt::new(other, self.md);
}
}
fn main() {
let mut sc = Scanner::new();
let n: i64 = sc.cin();
let a: i64 = sc.cin();
let b: i64 = sc.cin();
let _: i64 = sc.cin();
let p = ModInt::new(a, M) / (a + b);
let q = ModInt::new(b, M) / (a + b);
let mut ans = ModInt::new(0, M);
let mut c = ModInt::new(1, M);
for i in 0..n {
let x = c * (n + i);
let s = x * p.pow(n) * q.pow(i) * 100 / (a + b);
let t = x * q.pow(n) * p.pow(i) * 100 / (a + b);
ans += s;
ans += t;
c = c * (n + i) / (i + 1)
}
put!(ans);
}
use std::io::{self, Write};
use std::str::FromStr;
use std::collections::VecDeque;
struct Scanner { stdin: io::Stdin, buffer: VecDeque<String>, }
impl Scanner {
fn new() -> Self { Scanner { stdin: io::stdin(), buffer: VecDeque::new() } }
fn cin<T: FromStr>(&mut self) -> T {
while self.buffer.len() == 0 {
let mut line = String::new();
let _ = self.stdin.read_line(&mut line);
for w in line.split_whitespace() {
self.buffer.push_back(String::from(w));
}
}
self.buffer.pop_front().unwrap().parse::<T>().ok().unwrap()
}
}
Submission Info
Submission Time |
|
Task |
C - Best-of-(2n-1) |
User |
cympfh |
Language |
Rust (1.15.1) |
Score |
500 |
Code Size |
6761 Byte |
Status |
AC |
Exec Time |
210 ms |
Memory |
4352 KiB |
Compile Error
warning: unknown lint: `unused_macros`, #[warn(unknown_lints)] on by default
--> ./Main.rs:1:26
|
1 | #![allow(unused_imports, unused_macros, dead_code)]
| ^^^^^^^^^^^^^
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
500 / 500 |
Status |
|
|
Set Name |
Test Cases |
Sample |
example0.txt, example1.txt, example2.txt, example3.txt |
All |
000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, example0.txt, example1.txt, example2.txt, example3.txt |
Case Name |
Status |
Exec Time |
Memory |
000.txt |
AC |
188 ms |
4352 KiB |
001.txt |
AC |
210 ms |
4352 KiB |
002.txt |
AC |
199 ms |
4352 KiB |
003.txt |
AC |
203 ms |
4352 KiB |
004.txt |
AC |
193 ms |
4352 KiB |
005.txt |
AC |
190 ms |
4352 KiB |
006.txt |
AC |
193 ms |
4352 KiB |
007.txt |
AC |
181 ms |
4352 KiB |
008.txt |
AC |
195 ms |
4352 KiB |
example0.txt |
AC |
2 ms |
4352 KiB |
example1.txt |
AC |
2 ms |
4352 KiB |
example2.txt |
AC |
2 ms |
4352 KiB |
example3.txt |
AC |
190 ms |
4352 KiB |