传送门

看到 $n=250$ 显然考虑 $n^3$ 的 $dp$

设 $f[i][j]$ 表示填完前 $i$ 行,目前有 $j$ 列的最小值是 $1$ 的合法方案数

那么对于 $f[i][j]$ ,枚举 $f[i-1][k]$ ,有 $f[i][j]=\sum_{k=0}^{j}\binom{n-k}{j-k}f[i-1][k](m-1)^{n-j}m^k$

这里 $m$ 就是题目的 $k$

$\binom{n-k}{j-k}$ 是因为多出来的 $j-k$ 列 $1$ 可以任选

$(m-1)^{n-j}$ 是保证没有 $1$ 的列不能填 $1$ ,只有 $m-1$ 种填的数

$m^k$ 是那些原本有保证为 $1$ 的列怎么填都行

当然剩下的那 $j-k$ 个位置显然都是 $1$ ,方案数只有 $1$

然后这样就可以做到 $n^3 \log n$ 然后发现竟然 $T$ 了,所以预处理一下 $k \in [0,n],m^k$ 和 $k \in [0,n],(m-1)^k$ 即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. inline int read()
  9. {
  10. int x=,f=; char ch=getchar();
  11. while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
  12. while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
  13. return x*f;
  14. }
  15. const int mo=1e9+,N=;
  16. inline int fk(int x) { return x>=mo ? x-mo : x; }
  17. int n,m;
  18. int C[N][N],f[N][N];
  19. int mi[N],mi_1[N];
  20. int main()
  21. {
  22. n=read(),m=read();
  23. for(int i=;i<=n;i++)
  24. {
  25. C[i][]=;
  26. for(int j=;j<=i;j++)
  27. C[i][j]=fk(C[i-][j]+C[i-][j-]);
  28. }
  29. mi[]=mi_1[]=;
  30. for(int i=;i<=n;i++)
  31. {
  32. mi[i]=1ll*mi[i-]*m%mo;
  33. mi_1[i]=1ll*mi_1[i-]*(m-)%mo;
  34. }
  35. for(int j=;j<=n;j++) f[][j]=1ll*C[n][j]*mi_1[n-j]%mo;
  36. for(int i=;i<=n;i++)
  37. for(int j=;j<=n;j++)
  38. {
  39. for(int k=;k<=j;k++)
  40. {
  41. int x=1ll*f[i-][k]*C[n-k][j-k]%mo;
  42. int y=1ll*mi_1[n-j]*mi[k]%mo;
  43. f[i][j]=fk(f[i][j]+1ll*x*y%mo);
  44. if(j==k) f[i][j]=fk(f[i][j]-1ll*mi_1[n]*f[i-][k]%mo+mo);
  45. }
  46. }
  47. printf("%d\n",f[n][n]);
  48. return ;
  49. }

正常的做法

但是有些神仙看完数据说:" $n$ 太小了,可以出到 $10^5$ 级别"

所以考虑一下神仙的做法

看到有限制的方案数,考虑容斥!

总方案 - (一行不合法+一列不合法) + (两行不合法+两列不合法+一行一列不合法) - ......

那么写成式子就是长这个样子:

$\sum_{i=0}^{n}\sum_{j=0}^{n}(-1)^{i+j} \binom{n}{i}\binom{n}{j}m^{n^2-n(i+j)+ij}(m-1)^{n(i+j)-ij}$

上面 $m^{n^2-n(i+j)+ij}$ 就是没限制的位置顺便填,$(m-1)^{n(i+j)-ij}$ 就是强制 $i$ 行 $j$ 列的格子不能填 $1$

然后同样预处理一下 $m$ 和 $m-1$ 的幂次就可以做到 $n^2$

对着这个式子继续搞:

$\sum_{i=0}^{n}\sum_{j=0}^{n}(-1)^{i+j} \binom{n}{i}\binom{n}{j}m^{n^2-n(i+j)+ij}(m-1)^{n(i+j)-ij}$

$\sum_{i=0}^{n}(-1)^i\binom{n}{i}\sum_{j=0}^{n}(-1)^j\binom{n}{j}m^{(n-i)(n-j)}(m-1)^{(n-i)j}(m-1)^{ni}$

$\because \sum_{j=0}^{n}(-1)^j\binom{n}{j}m^{(n-i)(n-j)}(m-1)^{(n-i)j}=(m^{n-i}-(m-1)^{n-i})^n$

$\therefore \sum_{i=0}^{n}(-1)^i\binom{n}{i}(m-1)^{ni}(m^{n-i}-(m-1)^{n-i})^n$

$\sum_{i=0}^{n}(-1)^i\binom{n}{i}(m^{n-i}(m-1)^i-(m-1)^n)^n$

然后就可以 $n \log n$ 解决了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. inline int read()
  9. {
  10. int x=,f=; char ch=getchar();
  11. while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
  12. while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
  13. return x*f;
  14. }
  15. const int N=,mo=1e9+;
  16. inline int fk(int x) { return x>=mo ? x-mo : x; }
  17. int n,m,Ans;
  18. int C[N][N],mi[N],m_1i[N];
  19. inline int ksm(int x,int y)
  20. {
  21. int res=;
  22. while(y) { if(y&) res=1ll*res*x%mo; x=1ll*x*x%mo; y>>=; }
  23. return res;
  24. }
  25. int main()
  26. {
  27. n=read(),m=read();
  28. for(int i=;i<=n;i++)
  29. {
  30. C[i][]=;
  31. for(int j=;j<=i;j++) C[i][j]=fk(C[i-][j]+C[i-][j-]);
  32. }
  33. mi[]=m_1i[]=;
  34. for(int i=;i<=n;i++)
  35. {
  36. mi[i]=1ll*mi[i-]*m%mo;
  37. m_1i[i]=1ll*m_1i[i-]*(m-)%mo;
  38. }
  39. for(int i=;i<=n;i++)
  40. {
  41. int t=1ll*C[n][i]*ksm( fk(1ll*mi[n-i]*m_1i[i]%mo - m_1i[n] +mo) , n )%mo;
  42. i& ? Ans=fk(Ans-t+mo) : Ans=fk(Ans+t);
  43. }
  44. printf("%d\n",Ans);
  45. return ;
  46. }

Codeforces 1228E. Another Filling the Grid的更多相关文章

  1. [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

    [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...

  2. codeforces#1228E. Another Filling the Grid(容斥定理,思维)

    题目链接: https://codeforces.com/contest/1228/problem/E 题意: 给n*n的矩阵填数,使得每行和每列最小值都是1 矩阵中可以填1到$k$的数 数据范围: ...

  3. [Codeforces 1228E]Another Filling the Grid(组合数+容斥)

    题目链接 解题思路: 容斥一下好久可以得到式子 \(\sum_{i=0}^{n}\sum_{j=0}^{n}(-1)^{i+j}C_n^iC_n^j(k-1)^{ni+nj-ij}k^{n^2-(ni ...

  4. Another Filling the Grid

    E. Another Filling the Grid 参考:Codeforces Round #589 (Div. 2)-E. Another Filling the Grid-容斥定理 容斥这个东 ...

  5. [Codeforces 1245D] Shichikuji and Power Grid (最小生成树)

    [Codeforces 1245D] Shichikuji and Power Grid (最小生成树) 题面 有n个城市,坐标为\((x_i,y_i)\),还有两个系数\(c_i,k_i\).在每个 ...

  6. Codeforces Round #589 (Div. 2) E. Another Filling the Grid(DP, 组合数学)

    链接: https://codeforces.com/contest/1228/problem/E 题意: You have n×n square grid and an integer k. Put ...

  7. Codeforces Round #589 (Div. 2) B. Filling the Grid

    链接: https://codeforces.com/contest/1228/problem/B 题意: Suppose there is a h×w grid consisting of empt ...

  8. Codeforces Round #589 (Div. 2) Another Filling the Grid (dp)

    题意:问有多少种组合方法让每一行每一列最小值都是1 思路:我们可以以行为转移的状态 附加一维限制还有多少列最小值大于1 这样我们就可以不重不漏的按照状态转移 但是复杂度确实不大行(减了两个常数卡过去的 ...

  9. Codeforces 679C Bear and Square Grid

    Bear and Square Grid 枚举k * k 的位置, 然后接上它周围白色连通块的数量, 再统计完全在k * k范围里的连通块, 这个只要某个连通块全部的方格 在k * k里面就好, 并且 ...

随机推荐

  1. maven plugin

    assembly plugin [Maven学习]maven-assembly-plugin的使用 https://www.cnblogs.com/f-zhao/p/6929814.html使用Mav ...

  2. C语言处理CSV数据

    以下代码为博客 <Python的并行求和例子>: http://www.cnblogs.com/instant7/p/4312786.html 中并行python代码的C语言重写版. 用C ...

  3. Python3+RobotFramewok 循环判断以及Evaluate用法(三)

    本章主要介绍RF的循环,判断以及关键字Evaluate. 1. for循环 在RF中通过 :FOR 编写循环 :FOR ${i} in range 10 log ${i} @{list} create ...

  4. 010-数据结构-树形结构-B树[B-树]

    一.概述 B 树就是常说的“B 减树(B- 树)”,又名平衡多路(即不止两个子树)查找树. 在计算机科学中,B树(英语:B-tree)是一种自平衡的树,能够保持数据有序.这种数据结构能够让查找数据.顺 ...

  5. 用python读取csv信息并写入新的文件

    import csv fo = open("result.txt", "w+") reader = csv.reader(open('test.csv')) f ...

  6. Linux系统调优相关工具

    一.系统调优概述 系统的运行状况: CPU -> MEM -> DISK*-> NETWORK -> 应用程序调优 分析是否有瓶颈(依据当前应用需求) 调优(把错误的调正确) ...

  7. 【CodeForces - 939A】Love Triangle(模拟)

    Love Triangle Descriptions: 正如你所知道的,没有男性飞机也没有女性飞机.然而,地球上的每一个平面都喜欢另一个平面.地球上有n个平面,编号从1到n,编号i的平面喜欢编号fi的 ...

  8. 【并行计算-CUDA开发】CUDA软件架构与Nvidia硬件对应关系

    前面扯了很多,不过大多都是在讲CUDA 在软体层面的东西:接下来,虽然Heresy 自己也不熟,不过还是来研究一下硬体的部分吧-毕竟要最佳化的时候,好像还是要大概知道一下相关的东西的.这部分主要参考资 ...

  9. java_guide_9-30_并发相关

    3.1 CopyOnWriteArrayList 简介 public class CopyOnWriteArrayList<E> extends Object implements Lis ...

  10. freeRTOS学习8-20