Description

Input

Output

Sample Input

3 1 1
3425 734783767
2345 34674684
980733421 249802373

Sample Output

19260817

Data Constraint

Solution

  • 注意到m比较小,不妨分开考虑每个元素在哪些操作中被加了。

  • 考虑状压DP,先计算 f(i,S,j)f(i, S, j) 表示 AiA_i 在进行 SS 集合的操作之后,值为 jj 的概率。

  • 设 g(i,S,j)g(i, S,j) 表示前 ii 个元素的最大值为 jj,用掉了 SS 集合的操作的概率。

  • 转移时枚举当前元素用掉了哪些操作,以及进行这些操作后的值,即:

    g(i−1,S1,j)×f(i,S2,k)→g(i,S1+S2,max(j,k))

    g(i − 1, S1,j) × f(i, S2, k) → g(i, S1 + S2,max(j, k))

  • 那么答案即为

    ∑i=1m∗ci∗g[n][2m−1][i]  (mod 109+7)

    \sum_{i=1}^{m*c}{i*g[n][2^m-1][i]}\ \ (mod\ 10^9+7)

  • 枚举补集的小技巧:

    1. 先枚举集合 s1s1 ,设全 11 全集为 SS 。

    2. 令 num=S xor s1num=S\ xor\ s1 。

    3. 则 s1s1 的补集 s2s2 的初值为 numnum ,每次使 s2=(s2−1)& nums2=(s2-1)\& \ num 。

    4. 直到 s2s2 为 00 后不再枚举。

  • 时间复杂度 O(n(cm)23m)O(n(cm)^23^m) 。

Code

#include<cstdio>
#include<cctype>
#define add(x,y) x=(x+y)%mo
using namespace std;
typedef long long LL;
const int N=41,M=11,mo=1e9+7;
int n,m,c,mx,ans;
int p[M][N][4],h2[M];
int f[N][1<<M-1][M*3],g[N][1<<M-1][M*3];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline int max(int x,int y)
{return x>y?x:y;
}
int main()
{n=read(),m=read(),c=read(),mx=m*c;for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)for(int k=0;k<=c;k++) p[i][j][k]=read();for(int i=h2[0]=1;i<=m;i++) h2[i]=h2[i-1]<<1;for(int i=1;i<=n;i++){f[i][0][0]=1;for(int s=0;s<h2[m];s++)for(int k=1;k<=m;k++)if(s&h2[k-1]){for(int l=0;l<=c;l++)for(int j=0;l+j<=mx;j++)add(f[i][s][j+l],(LL)f[i][s^h2[k-1]][j]*p[k][i][l]%mo);break;}}g[0][0][0]=1;for(int i=1;i<=n;i++)for(int s1=0;s1<h2[m];s1++)for(int num=(h2[m]-1)^s1,s2=num;;s2=(s2-1)&num){for(int j=0;j<=mx;j++)if(g[i-1][s1][j])for(int k=0;k<=mx;k++)if(f[i][s2][k])add(g[i][s1|s2][max(j,k)],(LL)g[i-1][s1][j]*f[i][s2][k]%mo);if(!s2) break;}for(int i=1;i<=mx;i++) add(ans,(LL)i*g[n][h2[m]-1][i]%mo);printf("%d",ans);return 0;
}

JZOJ 5625. 【NOI2018模拟4.3】Max相关推荐

  1. JZOJ 5643. 【NOI2018模拟4.10】最小代价

    Description 给定一张n个点m条边的无向图,点编号1到n,每个点x有两个权值ax和bx.给定k,选出图中一个大小为k的点集S,使得S中任意两个点之间存在仅经过这个点集中的点的路径.S也存在两 ...

  2. JZOJ 5640. 【NOI2018模拟4.9】劈配

    Description Input Output 输出到文件 mentor.out 中. 按顺序输出每组数据的答案.对于每组数据,输出 2 行: • 第 1 行输出 n 个用空格隔开的正整数,其中第 ...

  3. JZOJ 5637. 【NOI2018模拟4.8】一双木棋

    Description 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结 束.落子的规则是:一个格子可 ...

  4. JZOJ 5629. 【NOI2018模拟4.4】Map

    Description Rin是个特别好动的少女. 一天Rin来到了一个遥远的都市.这个都市有N个建筑,编号从1到N,其中市中心编号为1,这个都市有M条双向通行的街道,每条街道连接着两个不同的建筑,其 ...

  5. JZOJ 5627. 【NOI2018模拟4.3】paint

    Description Input Output Sample Input 样例输入1 10 10 4 1 6 4 1 6 9 9 4 样例输入2 10 10 4 2 2 4 4 7 7 9 9 Sa ...

  6. JZOJ 5623. 【NOI2018模拟4.2】program

    Description Input Output Sample Input 10 5 8>6<2<>54< 4 7 1 10 4 4 2 9 8 10 Sample Ou ...

  7. JZOJ 5616. 【NOI2018模拟3.31】沧海尘记

    Description Input Output Data Constraint Solution 观察题目,就可以得出有变换: Ai=∑j=1nAj∗Pi,j A_i=\sum_{j=1}^{n}{ ...

  8. JZOJ 5618. 【NOI2018模拟3.31】华胥梦天

    Description Input Output Data Constraint Solution 吉如一论文里的线段树算法-- 对于一个区间,记录三个值:最大值 mx1mx1,最大值的个数 cntc ...

  9. JZOJ 5574. 【NOI2018模拟3.10】占领

    Description Input Output Sample Input 输入1: 6 2 1 1 2 2 3 2 4 1 5 5 6 输入2: 10 1 2 1 2 2 5 1 3 1 4 4 6 ...

最新文章

  1. JSP--JavaBean
  2. c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战
  3. JavaScript--jquery.min.js文件
  4. linux 产生50-100之内的随机数
  5. iis7配置php-7,PHP--Windows 7 +IIS7配置
  6. Promise 的基础用法
  7. Error: package or namespace load failed for ‘rJava’:
  8. REVERSE-PRACTICE-JarvisOJ-4
  9. 东山再起?这将是锤子新手机?或搭配全键盘...
  10. Windows下Goland的环境搭建
  11. GitHub 的“封神”之路!
  12. 力扣——盛最多水的容器
  13. python带界面的人脸识别_PyQt5+Caffe+Opencv搭建人脸识别登录界面
  14. Kafka如何保证不丢数据?
  15. (转)何为人?是为忍!
  16. 元数据:数据治理的基石
  17. HTML5 webSQL查看表结构
  18. 360卸载方法(最全面)
  19. H5社交漂流瓶交友源码/附安装教程
  20. 制造业S2B2B电商平台高效协同助力行业数字化步伐加快

热门文章

  1. 深入解析C++编程中的静态成员函数
  2. 【C++】简约的for循环
  3. 科大星云诗社动态20210413
  4. 二十、“安化辞骚千万卒,康吾故土祭吾躯”(2021.6.14)
  5. 十四、“沥沥雨丝如落泪,麻麻密密总为愁。”(2021.5.2)
  6. 最大似然估计(MLE:样本观测总体参数)是如何工作的?
  7. SQL中OBJECT_ID,OBJECT_NAME,OBJECT_DEFINITION的用法
  8. OpenGL从入门到精通--你好三角形
  9. 阻塞IO模型-数据读写
  10. 使用结构体的形式使一个函数返回多个数据