(upd:随机立方体AC)

太菜了只会部分分。以后慢慢补坑吧……

随机立方体:

30分:

正常人都能想到的的转移状态(我的确是弱智),从大往小填数,记录有多少个极大值点和三个方向上各占了多少。转移可以计算。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; #define upd(x,y) x+=y,x%=P typedef long long i64; const int N=;
const int P=; int f[][N][N][N][N]; int pwr(int x,int a){
int s=;
while(a){
if(a&)s=(i64)s*x%P;
x=(i64)x*x%P;
a>>=;
}
return s;
} int main()
{
int T;
scanf("%d",&T);
while(T--){
int r,c,l,n,m;
scanf("%d%d%d%d",&r,&c,&l,&m);
n=r*c*l;
if(m>r&&m>c&&m>l){
printf("0\n");
continue;
}
memset(f,,sizeof(f));
int w=,p=;
f[w][][][][]=;
int i,j,x,y,z;
for(i=n;i;i--){
swap(w,p);
memset(f[w],,sizeof(f[w]));
for(j=;j<=n-i+&&j<=m;j++)
for(x=;x<=n-i+&&x<=r;x++)
for(y=;y<=n-i+&&y<=c;y++)
for(z=;z<=n-i+&&z<=l;z++){
upd(f[w][j][x][y][z],(i64)f[p][j][x][y][z]*max(,x*y*z-(n-i))%P);
upd(f[w][j][x][y][z],(i64)f[p][j][x-][y][z]*(r-x+)*y*z%P);
upd(f[w][j][x][y][z],(i64)f[p][j][x][y-][z]*x*(c-y+)*z%P);
upd(f[w][j][x][y][z],(i64)f[p][j][x][y][z-]*x*y*(l-z+)%P);
upd(f[w][j][x][y][z],(i64)f[p][j][x][y-][z-]*x*(c-y+)*(l-z+)%P);
upd(f[w][j][x][y][z],(i64)f[p][j][x-][y][z-]*(r-x+)*y*(l-z+)%P);
upd(f[w][j][x][y][z],(i64)f[p][j][x-][y-][z]*(r-x+)*(c-y+)*z%P);
upd(f[w][j][x][y][z],(i64)f[p][j-][x-][y-][z-]*(r-x+)*(c-y+)*(l-z+)%P);
}
}
p=;
for(i=;i<=n;i++)
p=(i64)p*i%P;
printf("%d\n",(i64)f[w][m][r][c][l]*pwr(p,P-)%P);
}
return ;
}

AC:

容斥,钦定几个点为极大值点,其他不管,然后用组合数作为系数同时算本质相同的方案。

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long i64;
const int N=5e6+;
const int P=; int pwr(int x,int a){
int s=;
for(;a;a>>=,x=1ll*x*x%P)
if(a&)s=1ll*s*x%P;
return s;
} int inv[N],iinv[N];
int sinv[N],siinv[N];
int v[N],f[N]; int C(int n,int m){
return 1ll*inv[n]*iinv[m]%P*iinv[n-m]%P;
} int main()
{
int i;
inv[]=;
for(i=;i<N;i++)
inv[i]=1ll*inv[i-]*i%P;
iinv[N-]=pwr(inv[N-],P-);
for(i=N-;i;i--)
iinv[i-]=1ll*iinv[i]*i%P;
int T;
scanf("%d",&T);
while(T--){
int c,r,h,m;
scanf("%d%d%d%d",&c,&r,&h,&m);
int n=min(min(c,r),h);
int sv=1ll*c*r%P*h%P;
for(i=;i<=n;i++)
v[i]=(P+sv-1ll*(c-i)*(r-i)%P*(h-i)%P)%P;
for(i=;i<=n;i++)
f[i]=1ll*C(r,i)*C(c,i)%P*C(h,i)%P*pwr(inv[i],)%P;
sinv[]=;
for(i=;i<=n;i++)
sinv[i]=1ll*sinv[i-]*v[i]%P;
siinv[n]=pwr(sinv[n],P-);
for(i=n;i;i--)
siinv[i-]=1ll*siinv[i]*v[i]%P;
int ans=,d;
for(i=m,d=;i<=n;i++,d=P-d)
(ans+=1ll*d*C(i,m)%P*f[i]%P*siinv[i]%P)%=P;
printf("%d\n",ans);
}
return ;
}

珍珠:

O(nd):

只跟奇偶性有关。

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long i64;
const int P=;
const int S=5e7+;
const int N1=4e3+; int f[N1][N1]; int main()
{
int d,n,m,i,j;
scanf("%d%d%d",&d,&n,&m);
if((i64)d*n<S){
f[][]=;
for(i=;i<=n;i++)
for(j=;j<=d;j++){
if(j)f[i][j]+=(i64)f[i-][j-]*(d-j+)%P,
f[i][j]%=P;
if(j!=d)f[i][j]+=(i64)f[i-][j+]*(j+)%P,
f[i][j]%=P;
}
int ans=;
for(i=;i<=n-*m&&i<=d;i++)
ans+=f[n][i],ans%=P;
printf("%d",ans);
return ;
}
return ;
}

CTSC2019的更多相关文章

  1. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  2. 「CTS2019 | CTSC2019」氪金手游 解题报告

    「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...

  3. 「CTS2019 | CTSC2019」随机立方体 解题报告

    「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...

  4. LOJ 3119: 洛谷 P5400: 「CTS2019 | CTSC2019」随机立方体

    题目传送门:LOJ #3119. 题意简述: 题目说的很清楚了. 题解: 记恰好有 \(i\) 个极大的数的方案数为 \(\mathrm{cnt}[i]\),则答案为 \(\displaystyle\ ...

  5. LOJ 3120: 洛谷 P5401: 「CTS2019 | CTSC2019」珍珠

    题目传送门:LOJ #3120. 题意简述: 称一个长度为 \(n\),元素取值为 \([1,D]\) 的整数序列是合法的,当且仅当其中能够选出至少 \(m\) 对相同元素(不能重复选出元素). 问合 ...

  6. loj3120 「CTS2019 | CTSC2019」珍珠

    link .... 感觉自己太颓废了....还是来更题解吧...[话说写博客会不会涨 rp 啊 qaq ? 题意: 有 n 个物品,每个都有一个 [1,D] 中随机的颜色,相同颜色的两个物品可以配对. ...

  7. LOJ #3119「CTS2019 | CTSC2019」随机立方体 (容斥)

    博客链接 里面有个下降幂应该是上升幂 还有个bk的式子省略了k^3 CODE 蛮短的 #include <bits/stdc++.h> using namespace std; const ...

  8. 【LOJ】#3123. 「CTS2019 | CTSC2019」重复

    LOJ3123 60pts 正难则反,熟练转成总方案数减掉每个片段都大于等于s的字典序的方案 按照一般的套路建出kmp上每个点加一个字符的转移边的图(注意这个图开始字母必须是nxt链中下一个相邻的字符 ...

  9. 【LOJ】#3121. 「CTS2019 | CTSC2019」无处安放

    第一次有耐心去研究一道题答-- 以前看到题答要么扔要么就水能简单手玩出来的 1 2可以手玩出来,快乐! 4呢发现3 3比较格路,就把3 3都配了,一边带个4的除了4 4都塞满这么放进去,然后把一边带2 ...

  10. 【LOJ】#3120. 「CTS2019 | CTSC2019」珍珠

    LOJ3120 52pts \(N - D >= 2M\)或者\(M = 0\)那么就是\(D^{N}\) 只和数字的奇偶性有关,如果有k个奇数,那么必须满足\(N - k >= 2M\) ...

随机推荐

  1. 深入了解 Flink 网络栈(二):监控、指标和处理背压

    在之前的文章中,我们从高级抽象到底层细节各个层面全面介绍了 Flink 网络栈的工作机制.作为这一系列的第二篇文章,本文将在第一篇的基础上更进一步,主要探讨如何监视与网络相关的指标,从而识别背压等因素 ...

  2. kubernetes使用kubeadm升级集群

    升级前准本  官网: https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-upgrade/查看可升级的组件 [root@h ...

  3. layui-treeTable v2.0添加搜索功能

    layui-treeTable 添加搜索功能 在树形表格头部加一个input框: <div class="layui-inline"> <input class= ...

  4. bind-dns服务器搭建

    环境:主服务器上IP为192.168.159.30 安装相关包bind dns服务器  bind-utils提供nslookup dig等命令 yum -y install bind bind-uti ...

  5. Redis入门很简单之一【简介与环境搭建】

    Redis入门很简单之一[简介与环境搭建] 博客分类: NoSQL/Redis/MongoDB redisnosqlmemcached缓存中间件  [Redis简介] <一>. NoSQL ...

  6. js千位符 | js 千位分隔符 | js 金额格式化

    js 千位分隔符 千位分隔符,其实就是数字中的逗号.依西方的习惯,人们在数字中加进一个符号,以免因数字位数太多而难以看出它的值.所以人们在数字中,每隔三位数加进一个逗号,也就是千位分隔符,以便更加容易 ...

  7. datetime timestamp使用

    #coding=utf-8 import time import datetime def yes_time(): #获取当前时间 now_time = datetime.datetime.now() ...

  8. Django框架(三十)—— 使用Vue搭建前台

    目录 vue的使用 一.创建vue项目 二.pycharm开发vue项目 1.安装vue.js插件 2.运行vue项目 三.vue项目的目录结构 四.vue的使用 1.创建新的组件 2.显示数据 3. ...

  9. Oracle查询最近执行过的SQL语句

    oracle 查询最近执行过的 SQL语句 select sql_text,last_load_time from v$sql order by last_load_time desc; SELECT ...

  10. MUI对话框使用

    一.alert告警框 用法 .alert(message,title,btnvalue,callback[,type]); document.getElementById("noclick& ...