# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
200059 | guangxuan | Fishing Game (RMI19_fishing) | C++14 | 388 ms | 107256 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
const long long MOD=1e9+7;
using namespace std;
int mm[301][301][301];
int dp(int x,int y,int z){ // ab,bc,ca
if(mm[x][y][z]!=-1)return mm[x][y][z];
if(x==0&&y==0&&z==0)return mm[x][y][z]=1;
mm[x][y][z]=0;
//printf("STATE %d %d %d\n",x,y,z);
for(int xk=0;xk<2;xk++){
int x2=x,y2=y,z2=z,mult=1;
if(x2+z2!=0){
if(xk){
mult*=x2;
x2--;
}
else{
mult*=z2;
z2--,y2++;
}
}
else if(xk)continue;//do nothing!
if(x2<0||y2<0||z2<0)continue;
for(int yk=0;yk<2;yk++){
int x3=x2,y3=y2,z3=z2,mult2=mult;
if(x3+y3!=0){
if(yk){
mult2*=y3;
y3--;
}
else{
mult2*=x3;
x3--,z3++;
}
}
else if(yk)continue;//do nothing!
if(x3<0||y3<0||z3<0)continue;
for(int zk=0;zk<2;zk++){
int x4=x3,y4=y3,z4=z3,mult3=mult2;
if(y4+z4!=0){
if(zk){
mult3*=z4;
z4--;
}
else{
mult3*=y4;
y4--,x4++;
}
}
else if(zk)continue;//do nothing!
if(x4<0||y4<0||z4<0)continue;
if((xk||yk||zk)==0)continue;
//printf("TRANS %d %d %d %lld\n",x4,y4,z4,mult);
mm[x][y][z]=((long long)mm[x][y][z]+(long long)dp(x4,y4,z4)*mult3)%MOD;
}
}
}
return mm[x][y][z];
}
int hascard[3][300];
int main(){
int n,t;
scanf("%d%d",&n,&t);
while(t--){
memset(mm,-1,sizeof mm);
memset(hascard,0,sizeof hascard);
int x=0,y=0,z=0;
for(int p=0;p<3;p++){
for(int i=0;i<n*2;i++){
int card;
scanf("%d",&card);
card--;
hascard[p][card]=1;
}
}
for(int i=0;i<3*n;i++){
x+=hascard[0][i]&&hascard[1][i];
y+=hascard[1][i]&&hascard[2][i];
z+=hascard[2][i]&&hascard[0][i];
}
printf("%d\n",dp(x,y,z));
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |