CTSC2019
(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的更多相关文章
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
- 「CTS2019 | CTSC2019」氪金手游 解题报告
「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...
- 「CTS2019 | CTSC2019」随机立方体 解题报告
「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...
- LOJ 3119: 洛谷 P5400: 「CTS2019 | CTSC2019」随机立方体
题目传送门:LOJ #3119. 题意简述: 题目说的很清楚了. 题解: 记恰好有 \(i\) 个极大的数的方案数为 \(\mathrm{cnt}[i]\),则答案为 \(\displaystyle\ ...
- LOJ 3120: 洛谷 P5401: 「CTS2019 | CTSC2019」珍珠
题目传送门:LOJ #3120. 题意简述: 称一个长度为 \(n\),元素取值为 \([1,D]\) 的整数序列是合法的,当且仅当其中能够选出至少 \(m\) 对相同元素(不能重复选出元素). 问合 ...
- loj3120 「CTS2019 | CTSC2019」珍珠
link .... 感觉自己太颓废了....还是来更题解吧...[话说写博客会不会涨 rp 啊 qaq ? 题意: 有 n 个物品,每个都有一个 [1,D] 中随机的颜色,相同颜色的两个物品可以配对. ...
- LOJ #3119「CTS2019 | CTSC2019」随机立方体 (容斥)
博客链接 里面有个下降幂应该是上升幂 还有个bk的式子省略了k^3 CODE 蛮短的 #include <bits/stdc++.h> using namespace std; const ...
- 【LOJ】#3123. 「CTS2019 | CTSC2019」重复
LOJ3123 60pts 正难则反,熟练转成总方案数减掉每个片段都大于等于s的字典序的方案 按照一般的套路建出kmp上每个点加一个字符的转移边的图(注意这个图开始字母必须是nxt链中下一个相邻的字符 ...
- 【LOJ】#3121. 「CTS2019 | CTSC2019」无处安放
第一次有耐心去研究一道题答-- 以前看到题答要么扔要么就水能简单手玩出来的 1 2可以手玩出来,快乐! 4呢发现3 3比较格路,就把3 3都配了,一边带个4的除了4 4都塞满这么放进去,然后把一边带2 ...
- 【LOJ】#3120. 「CTS2019 | CTSC2019」珍珠
LOJ3120 52pts \(N - D >= 2M\)或者\(M = 0\)那么就是\(D^{N}\) 只和数字的奇偶性有关,如果有k个奇数,那么必须满足\(N - k >= 2M\) ...
随机推荐
- boost pointer container
1. boost::ptr_vector #include <boost/ptr_container/ptr_vector.hpp> #include <iostream> i ...
- apue 第4章 文件和目录
获取文件属性 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(c ...
- nucleus学习
task的TCB结构: typedef struct TC_TCB_STRUCT { /* Standard thread information first. This information is ...
- px4::init_once();和px4::init(argc, argv, "px4");函数学习
px4::init_once(); void init_once() { _shell_task_id = pthread_self(); ...
- Linux 应用程序编程基础
一个计算机应用程序在内存中可以分成两个部分:存放代码的代码段和存放数据的数据段.代码段存放用户编写的代码;数据段存放栈和堆. 相关内存管理函数 #include <stdlib.h> vo ...
- Python基础教程(002)--编译型语音和解释器
前言 理解解释器和编译型语言,及跨平台 解释器(科普) 计算机不能直接理解任何出机器语言以外的机器语言,必须要把程序员写的程序语言进行翻译,就是编辑. 将其他语音翻译成机器语言,被称为编译器. 编译器 ...
- 微信小程序,获取二维码
微信小程序,获取二维码 找到一篇很实用的博客,他已经写得很详细了,自己也懒得写,亲测有效 参考网址
- Linux安装Oracle 10g
目录 目录 环境 RHEL6 Configuration Update JDK 配置Oracle安装环境 硬件检测 软件检测 编辑配置文件 安装Oracle Database 环境 系统 RHEL6 ...
- Jmeter命令行 传递参数
二.参数 -J 和 -G 1.格式:-J变量名=值 -G变量名=值 2.相同之处:设置jmeter属性,例如线程数.循环次数.ramp up-time等 3.不同之处:-J是设置本地jmeter属性 ...
- multiple-cursors实在是太好用了
multiple-cursors实在是太好用了 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #8 ...