Codeforces 1228E. Another Filling the Grid
看到 $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$ 即可
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- using namespace std;
- typedef long long ll;
- inline int read()
- {
- int x=,f=; char ch=getchar();
- while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
- while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
- return x*f;
- }
- const int mo=1e9+,N=;
- inline int fk(int x) { return x>=mo ? x-mo : x; }
- int n,m;
- int C[N][N],f[N][N];
- int mi[N],mi_1[N];
- int main()
- {
- n=read(),m=read();
- for(int i=;i<=n;i++)
- {
- C[i][]=;
- for(int j=;j<=i;j++)
- C[i][j]=fk(C[i-][j]+C[i-][j-]);
- }
- mi[]=mi_1[]=;
- for(int i=;i<=n;i++)
- {
- mi[i]=1ll*mi[i-]*m%mo;
- mi_1[i]=1ll*mi_1[i-]*(m-)%mo;
- }
- for(int j=;j<=n;j++) f[][j]=1ll*C[n][j]*mi_1[n-j]%mo;
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- {
- for(int k=;k<=j;k++)
- {
- int x=1ll*f[i-][k]*C[n-k][j-k]%mo;
- int y=1ll*mi_1[n-j]*mi[k]%mo;
- f[i][j]=fk(f[i][j]+1ll*x*y%mo);
- if(j==k) f[i][j]=fk(f[i][j]-1ll*mi_1[n]*f[i-][k]%mo+mo);
- }
- }
- printf("%d\n",f[n][n]);
- return ;
- }
正常的做法
但是有些神仙看完数据说:" $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$ 解决了
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- using namespace std;
- typedef long long ll;
- inline int read()
- {
- int x=,f=; char ch=getchar();
- while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
- while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
- return x*f;
- }
- const int N=,mo=1e9+;
- inline int fk(int x) { return x>=mo ? x-mo : x; }
- int n,m,Ans;
- int C[N][N],mi[N],m_1i[N];
- inline int ksm(int x,int y)
- {
- int res=;
- while(y) { if(y&) res=1ll*res*x%mo; x=1ll*x*x%mo; y>>=; }
- return res;
- }
- int main()
- {
- n=read(),m=read();
- for(int i=;i<=n;i++)
- {
- C[i][]=;
- for(int j=;j<=i;j++) C[i][j]=fk(C[i-][j]+C[i-][j-]);
- }
- mi[]=m_1i[]=;
- for(int i=;i<=n;i++)
- {
- mi[i]=1ll*mi[i-]*m%mo;
- m_1i[i]=1ll*m_1i[i-]*(m-)%mo;
- }
- for(int i=;i<=n;i++)
- {
- int t=1ll*C[n][i]*ksm( fk(1ll*mi[n-i]*m_1i[i]%mo - m_1i[n] +mo) , n )%mo;
- i& ? Ans=fk(Ans-t+mo) : Ans=fk(Ans+t);
- }
- printf("%d\n",Ans);
- return ;
- }
Codeforces 1228E. Another Filling the Grid的更多相关文章
- [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)
[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...
- codeforces#1228E. Another Filling the Grid(容斥定理,思维)
题目链接: https://codeforces.com/contest/1228/problem/E 题意: 给n*n的矩阵填数,使得每行和每列最小值都是1 矩阵中可以填1到$k$的数 数据范围: ...
- [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 ...
- Another Filling the Grid
E. Another Filling the Grid 参考:Codeforces Round #589 (Div. 2)-E. Another Filling the Grid-容斥定理 容斥这个东 ...
- [Codeforces 1245D] Shichikuji and Power Grid (最小生成树)
[Codeforces 1245D] Shichikuji and Power Grid (最小生成树) 题面 有n个城市,坐标为\((x_i,y_i)\),还有两个系数\(c_i,k_i\).在每个 ...
- 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 ...
- 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 ...
- Codeforces Round #589 (Div. 2) Another Filling the Grid (dp)
题意:问有多少种组合方法让每一行每一列最小值都是1 思路:我们可以以行为转移的状态 附加一维限制还有多少列最小值大于1 这样我们就可以不重不漏的按照状态转移 但是复杂度确实不大行(减了两个常数卡过去的 ...
- Codeforces 679C Bear and Square Grid
Bear and Square Grid 枚举k * k 的位置, 然后接上它周围白色连通块的数量, 再统计完全在k * k范围里的连通块, 这个只要某个连通块全部的方格 在k * k里面就好, 并且 ...
随机推荐
- maven plugin
assembly plugin [Maven学习]maven-assembly-plugin的使用 https://www.cnblogs.com/f-zhao/p/6929814.html使用Mav ...
- C语言处理CSV数据
以下代码为博客 <Python的并行求和例子>: http://www.cnblogs.com/instant7/p/4312786.html 中并行python代码的C语言重写版. 用C ...
- Python3+RobotFramewok 循环判断以及Evaluate用法(三)
本章主要介绍RF的循环,判断以及关键字Evaluate. 1. for循环 在RF中通过 :FOR 编写循环 :FOR ${i} in range 10 log ${i} @{list} create ...
- 010-数据结构-树形结构-B树[B-树]
一.概述 B 树就是常说的“B 减树(B- 树)”,又名平衡多路(即不止两个子树)查找树. 在计算机科学中,B树(英语:B-tree)是一种自平衡的树,能够保持数据有序.这种数据结构能够让查找数据.顺 ...
- 用python读取csv信息并写入新的文件
import csv fo = open("result.txt", "w+") reader = csv.reader(open('test.csv')) f ...
- Linux系统调优相关工具
一.系统调优概述 系统的运行状况: CPU -> MEM -> DISK*-> NETWORK -> 应用程序调优 分析是否有瓶颈(依据当前应用需求) 调优(把错误的调正确) ...
- 【CodeForces - 939A】Love Triangle(模拟)
Love Triangle Descriptions: 正如你所知道的,没有男性飞机也没有女性飞机.然而,地球上的每一个平面都喜欢另一个平面.地球上有n个平面,编号从1到n,编号i的平面喜欢编号fi的 ...
- 【并行计算-CUDA开发】CUDA软件架构与Nvidia硬件对应关系
前面扯了很多,不过大多都是在讲CUDA 在软体层面的东西:接下来,虽然Heresy 自己也不熟,不过还是来研究一下硬体的部分吧-毕竟要最佳化的时候,好像还是要大概知道一下相关的东西的.这部分主要参考资 ...
- java_guide_9-30_并发相关
3.1 CopyOnWriteArrayList 简介 public class CopyOnWriteArrayList<E> extends Object implements Lis ...
- freeRTOS学习8-20