結果

問題 No.1688 Veterinarian
ユーザー LayCurse
提出日時 2021-09-04 09:19:10
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 10,219 bytes
コンパイル時間 3,112 ms
コンパイル使用メモリ 227,256 KB
最終ジャッジ日時 2025-01-24 07:44:40
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 3
other WA * 14
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
#define MD (1000000007U)
struct Modint{
unsigned val;
Modint(){
val=0;
}
Modint(int a){
val = ord(a);
}
Modint(unsigned a){
val = ord(a);
}
Modint(long long a){
val = ord(a);
}
Modint(unsigned long long a){
val = ord(a);
}
inline unsigned ord(unsigned a){
return a%MD;
}
inline unsigned ord(int a){
a %= (int)MD;
if(a < 0){
a += MD;
}
return a;
}
inline unsigned ord(unsigned long long a){
return a%MD;
}
inline unsigned ord(long long a){
a %= (int)MD;
if(a < 0){
a += MD;
}
return a;
}
inline unsigned get(){
return val;
}
inline Modint &operator++(){
val++;
if(val >= MD){
val -= MD;
}
return *this;
}
inline Modint &operator--(){
if(val == 0){
val = MD - 1;
}
else{
--val;
}
return *this;
}
inline Modint operator++(int a){
Modint res(*this);
val++;
if(val >= MD){
val -= MD;
}
return res;
}
inline Modint operator--(int a){
Modint res(*this);
if(val == 0){
val = MD - 1;
}
else{
--val;
}
return res;
}
inline Modint &operator+=(Modint a){
val += a.val;
if(val >= MD){
val -= MD;
}
return *this;
}
inline Modint &operator-=(Modint a){
if(val < a.val){
val = val + MD - a.val;
}
else{
val -= a.val;
}
return *this;
}
inline Modint &operator*=(Modint a){
val = ((unsigned long long)val*a.val)%MD;
return *this;
}
inline Modint &operator/=(Modint a){
return *this *= a.inverse();
}
inline Modint operator+(Modint a){
return Modint(*this)+=a;
}
inline Modint operator-(Modint a){
return Modint(*this)-=a;
}
inline Modint operator*(Modint a){
return Modint(*this)*=a;
}
inline Modint operator/(Modint a){
return Modint(*this)/=a;
}
inline Modint operator+(int a){
return Modint(*this)+=Modint(a);
}
inline Modint operator-(int a){
return Modint(*this)-=Modint(a);
}
inline Modint operator*(int a){
return Modint(*this)*=Modint(a);
}
inline Modint operator/(int a){
return Modint(*this)/=Modint(a);
}
inline Modint operator+(long long a){
return Modint(*this)+=Modint(a);
}
inline Modint operator-(long long a){
return Modint(*this)-=Modint(a);
}
inline Modint operator*(long long a){
return Modint(*this)*=Modint(a);
}
inline Modint operator/(long long a){
return Modint(*this)/=Modint(a);
}
inline Modint operator-(void){
Modint res;
if(val){
res.val=MD-val;
}
else{
res.val=0;
}
return res;
}
inline operator bool(void){
return val!=0;
}
inline operator int(void){
return get();
}
inline operator long long(void){
return get();
}
inline Modint inverse(){
int a = val;
int b = MD;
int u = 1;
int v = 0;
int t;
Modint res;
while(b){
t = a / b;
a -= t * b;
swap(a, b);
u -= t * v;
swap(u, v);
}
if(u < 0){
u += MD;
}
res.val = u;
return res;
}
inline Modint pw(unsigned long long b){
Modint a(*this);
Modint res;
res.val = 1;
while(b){
if(b&1){
res *= a;
}
b >>= 1;
a *= a;
}
return res;
}
inline bool operator==(int a){
return ord(a)==val;
}
inline bool operator!=(int a){
return ord(a)!=val;
}
}
;
inline Modint operator+(int a, Modint b){
return Modint(a)+=b;
}
inline Modint operator-(int a, Modint b){
return Modint(a)-=b;
}
inline Modint operator*(int a, Modint b){
return Modint(a)*=b;
}
inline Modint operator/(int a, Modint b){
return Modint(a)/=b;
}
inline Modint operator+(long long a, Modint b){
return Modint(a)+=b;
}
inline Modint operator-(long long a, Modint b){
return Modint(a)-=b;
}
inline Modint operator*(long long a, Modint b){
return Modint(a)*=b;
}
inline Modint operator/(long long a, Modint b){
return Modint(a)/=b;
}
inline int my_getchar_unlocked(){
static char buf[1048576];
static int s = 1048576;
static int e = 1048576;
if(s == e && e == 1048576){
e = fread_unlocked(buf, 1, 1048576, stdin);
s = 0;
}
if(s == e){
return EOF;
}
return buf[s++];
}
struct MY_WRITER{
char buf[1048576];
int s;
int e;
MY_WRITER(){
s = 0;
e = 1048576;
}
~MY_WRITER(){
if(s){
fwrite_unlocked(buf, 1, s, stdout);
}
}
}
;
MY_WRITER MY_WRITER_VAR;
void my_putchar_unlocked(int a){
if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){
fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);
MY_WRITER_VAR.s = 0;
}
MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;
}
inline void wt_L(char a){
my_putchar_unlocked(a);
}
inline void wt_L(int x){
int s=0;
int m=0;
char f[10];
if(x<0){
m=1;
x=-x;
}
while(x){
f[s++]=x%10;
x/=10;
}
if(!s){
f[s++]=0;
}
if(m){
my_putchar_unlocked('-');
}
while(s--){
my_putchar_unlocked(f[s]+'0');
}
}
inline void wt_L(Modint x){
int i;
i = (int)x;
wt_L(i);
}
long long cReader_ll(long long mn, long long mx, char nx){
int i;
int fg = 0;
int m = 1;
int f = -1;
long long res = 0;
double tmp = 0;
for(;;){
i = my_getchar_unlocked();
if(fg==0 && i=='-'){
fg++;
m = -1;
}
else if('0' <= i && i <= '9'){
fg++;
if(f == -1){
f = i - '0';
}
res = 10 * res + i - '0';
tmp = 10 * tmp + i - '0';
assert(tmp < 1e20);
}
else{
break;
}
}
assert(tmp / 2 <= res);
assert((m==1 && fg >= 1) || (m==-1 && fg >= 2));
assert(mn <= m * res && m * res <= mx);
assert(!(res == 0 && m == -1));
assert(!(res != 0 && f == 0));
assert(!(res == 0 && fg >= 2));
assert(i == nx);
return m * res;
}
void cReader_eof(){
int i;
i = my_getchar_unlocked();
assert(i == EOF);
}
int A;
int B;
int C;
int N;
Modint dp[51][51][51];
Modint p[51][151];
Modint tmp;
Modint res[3];
int main(){
int cTE1_r3A, i;
A = cReader_ll(1, 50, ' ');
B = cReader_ll(1, 50, ' ');
C = cReader_ll(1, 50, ' ');
N = cReader_ll(1, 50, '\n');
cReader_eof();
for(i=(1);i<(51);i++){
int j;
for(j=(3);j<(151);j++){
p[i][j] = ((Modint) i * (i-1)) / ((Modint) j * (j-1));
}
}
dp[A][B][C] = 1;
for(cTE1_r3A=(0);cTE1_r3A<(N);cTE1_r3A++){
for(i=(1);i<(A+1);i++){
int j;
for(j=(1);j<(B+1);j++){
int k;
for(k=(1);k<(C+1);k++){
tmp = dp[i][j][k];
dp[i-1][j][k] += tmp * p[i][i+j+k];
dp[i][j-1][k] += tmp * p[j][i+j+k];
dp[i][j][k-1] += tmp * p[k][i+j+k];
dp[i][j][k] -= tmp * (p[i][i+j+k] + p[j][i+j+k] + p[k][i+j+k]);
}
}
}
}
for(i=(1);i<(A+1);i++){
int j;
for(j=(1);j<(B+1);j++){
int k;
for(k=(1);k<(C+1);k++){
res[0] += (A-i) * dp[i][j][k];
res[1] += (B-j) * dp[i][j][k];
res[2] += (C-k) * dp[i][j][k];
}
}
}
{
int jbtyPBGc;
if(3==0){
wt_L('\n');
}
else{
for(jbtyPBGc=(0);jbtyPBGc<(3-1);jbtyPBGc++){
wt_L(res[jbtyPBGc]);
wt_L(' ');
}
wt_L(res[jbtyPBGc]);
wt_L('\n');
}
}
{
Modint chk1;
Modint chk2;
string s1 = "3452192328044966520392806880021097467";
string s2 = "1921444247213913479420805120000000000";
string s3 = "1171514706712320746421671594290613233";
string s4 = "1097968141265093416811888640000000000";
string s5 = "5105000684786014790930854501796258921";
string s6 = "11528665483283480876524830720000000000";
chk1 = chk2 = 0;
for(i=(0);i<(s1.size());i++){
chk1 = chk1 * 10 + s1[i] - '0';
}
for(i=(0);i<(s2.size());i++){
chk2 = chk2 * 10 + s2[i] - '0';
}
wt_L(chk1 / chk2);
wt_L('\n');
chk1 = chk2 = 0;
for(i=(0);i<(s3.size());i++){
chk1 = chk1 * 10 + s3[i] - '0';
}
for(i=(0);i<(s4.size());i++){
chk2 = chk2 * 10 + s4[i] - '0';
}
wt_L(chk1 / chk2);
wt_L('\n');
chk1 = chk2 = 0;
for(i=(0);i<(s5.size());i++){
chk1 = chk1 * 10 + s5[i] - '0';
}
for(i=(0);i<(s6.size());i++){
chk2 = chk2 * 10 + s6[i] - '0';
}
wt_L(chk1 / chk2);
wt_L('\n');
}
return 0;
}
// cLay version 20210819-1 [beta]
// --- original code ---
// int A, B, C, N;
// Modint dp[51][51][51], p[51][151], tmp, res[3];
// {
// A = cReader_ll(1, 50, ' ');
// B = cReader_ll(1, 50, ' ');
// C = cReader_ll(1, 50, ' ');
// N = cReader_ll(1, 50, '\n');
// cReader_eof();
// rep(i,1,51) rep(j,3,151) p[i][j] = ((Modint) i * (i-1)) / ((Modint) j * (j-1));
// dp[A][B][C] = 1;
// rep(N){
// rep(i,1,A+1) rep(j,1,B+1) rep(k,1,C+1){
// tmp = dp[i][j][k];
// dp[i-1][j][k] += tmp * p[i][i+j+k];
// dp[i][j-1][k] += tmp * p[j][i+j+k];
// dp[i][j][k-1] += tmp * p[k][i+j+k];
// dp[i][j][k] -= tmp * (p[i][i+j+k] + p[j][i+j+k] + p[k][i+j+k]);
// }
// }
// rep(i,1,A+1) rep(j,1,B+1) rep(k,1,C+1){
// res[0] += (A-i) * dp[i][j][k];
// res[1] += (B-j) * dp[i][j][k];
// res[2] += (C-k) * dp[i][j][k];
// }
// wt(res(3));
//
// {
// Modint chk1, chk2;
// string s1 = "3452192328044966520392806880021097467";
// string s2 = "1921444247213913479420805120000000000";
// string s3 = "1171514706712320746421671594290613233";
// string s4 = "1097968141265093416811888640000000000";
// string s5 = "5105000684786014790930854501796258921";
// string s6 = "11528665483283480876524830720000000000";
//
// chk1 = chk2 = 0;
// rep(i,s1.size()) chk1 = chk1 * 10 + s1[i] - '0';
// rep(i,s2.size()) chk2 = chk2 * 10 + s2[i] - '0';
// wt(chk1 / chk2);
//
// chk1 = chk2 = 0;
// rep(i,s3.size()) chk1 = chk1 * 10 + s3[i] - '0';
// rep(i,s4.size()) chk2 = chk2 * 10 + s4[i] - '0';
// wt(chk1 / chk2);
//
// chk1 = chk2 = 0;
// rep(i,s5.size()) chk1 = chk1 * 10 + s5[i] - '0';
// rep(i,s6.size()) chk2 = chk2 * 10 + s6[i] - '0';
// wt(chk1 / chk2);
// }
//
// }
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0