题目链接

容易想到容斥,但是很恶心,因为要对行和列都容斥,然后行+列又要容斥。。

于是得到\(O(nm\log)\)的做法。

就有70分了:

#include <cstdio>
#include <algorithm>
#define mod (1000000007)
#define Mod(x) (x>mod&&(x-=mod))//>=
#define ID(x,y) ((x-1)*m+y)
typedef long long LL;
const int N=1e5+5,M=1005; int n,m; namespace Subtask1
{
int Cn[N],Cm[N],inv[N];
inline LL FP(LL x,LL k)
{
LL t=1;
for(; k; k>>=1,x=x*x%mod)
if(k&1) t=t*x%mod;
return t;
}
LL Calc(LL n,LL m,int *C)
{
LL res=0;
for(int i=1; i<=n; ++i)
if(i&1) res+=1ll*C[i]*FP(2,(n-i)*m)%mod;
else res-=1ll*C[i]*FP(2,(n-i)*m)%mod;
return (res%mod+mod)%mod;
}
LL Unique(LL n,LL m)
{
LL res=0;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
if((i+j)&1) res+=1ll*Cn[i]*Cm[j]%mod*FP(2,(n-i)*(m-j))%mod;
else res-=1ll*Cn[i]*Cm[j]%mod*FP(2,(n-i)*(m-j))%mod;
return (res%mod+mod)%mod;
}
void Main(int n,int m)
{
Cn[0]=Cm[0]=inv[1]=1;
for(int i=2,l=std::max(n,m); i<=l; ++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(int i=1; i<=n; ++i) Cn[i]=1ll*Cn[i-1]*(n-i+1)%mod*inv[i]%mod;
for(int i=1; i<=m; ++i) Cm[i]=1ll*Cm[i-1]*(m-i+1)%mod*inv[i]%mod;
// printf("%I64d-%I64d-%I64d-%I64d\n",FP(2,1ll*n*m),Calc(n,m,Cn),Calc(m,n,Cm),Unique(n,m)-mod);
printf("%I64d\n",((FP(2,1ll*n*m)-(Calc(n,m,Cn)+Calc(m,n,Cm)+Unique(n,m))%mod)%mod+mod)%mod);
}
}
namespace TEST
{
int Ans;
bool col[1005][1005],vis[20000001];
bool Checkr()//存在某行未染色的方案数
{
for(int i=1; i<=n; ++i)
{
for(int j=m; ~j; --j)
if(!j) return 1;
else if(col[i][j]) break;
}
return 0;
}
bool Checkc()//存在某列未染色的方案数
{
for(int j=1; j<=m; ++j)
{
for(int i=n; ~i; --i)
if(!i) return 1;
else if(col[i][j]) break;
}
return 0;
}
void DFS(int x,int y,int s)
{
if(y>m) y=1, ++x;
if(x>n)
{
if(!vis[s]&&Checkc())
{
puts("\nOK:");
for(int i=1; i<=n; ++i,putchar('\n'))
for(int j=1; j<=m; ++j) printf("%d ",col[i][j]);
++Ans, vis[s]=1;
}
return;
}
DFS(x,y+1,s), col[x][y]=1, DFS(x,y+1,s|(1<<ID(x,y)-1)), col[x][y]=0;
}
void Main()
{
DFS(1,1,0), printf("%d\n",Ans);
}
} int main()
{
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout); scanf("%d%d",&n,&m);
if(m==1) return putchar('1'),0;
// if(n==100000&&m==100000) return printf(""),0;//可能要跑2h。。没早打表
// TEST::Main();
if(n<=1000&&m<=1000||1ll*n*m<=1400000||1) {Subtask1::Main(n,m); return 0;} return 0;
}

其实只要保证列合法,只对行容斥就可以了。

当确定\(k\)行不染色时,每列合法的方案数是\(2^{n-k}-1\),然后\(m\)列的方案数就是它的\(m\)次方。

#include <cstdio>
#include <algorithm>
#define mod (1000000007)
typedef long long LL;
const int N=1e5+5; int inv[N],C[N]; inline LL FP(LL x,LL k)
{
x<0&&(x+=mod);
LL t=1;
for(; k; k>>=1,x=x*x%mod)
if(k&1) t=t*x%mod;
return t;
}
LL Calc(LL n,LL m)
{
LL res=0;
for(int i=0; i<=n; ++i)
if(i&1) res-=1ll*C[i]*FP(FP(2,n-i)-1,m)%mod;
else res+=1ll*C[i]*FP(FP(2,n-i)-1,m)%mod;
return (res%mod+mod)%mod;
} int main()
{
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout); int n,m; scanf("%d%d",&n,&m);
C[0]=inv[1]=1;
for(int i=2; i<=n; ++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(int i=1; i<=n; ++i) C[i]=1ll*C[i-1]*(n-i+1)%mod*inv[i]%mod;
printf("%I64d\n",Calc(n,m)); return 0;
}

五校联考R1 Day2T2 矩阵matrix(容斥)的更多相关文章

  1. 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)

    题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...

  2. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

  3. 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底

    [五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...

  4. 五校联考模拟赛Day2T2矩阵(容斥原理)

    题意 $n * m$的网格,对其进行黑白染色,问每一行每一列至少有一个黑格子的方案数. Sol 考场上只会$n^3$的dp,还和指数级枚举一个分qwq 设$f[i][j]$表示到了第$i$行,已经有$ ...

  5. 【2020五校联考NOIP #2】矩阵

    咕咕咕到现在~ 题面传送门 题意: 给出一个 \(n\times n\) 的矩阵 \(A\).要你求有多少个 \(n\times n\) 的矩阵 \(B\) 满足: 每一行都是 \(1\) 到 \(n ...

  6. 【NOIP2016提高A组五校联考4】square

    题目 分析 首先,设\(f_{i,j}\)表示最大的以(i,j)为左下角的正方形的边长. 转移显然,\(f_{i,j}=\max(f_{i-1,j},f_{i,j-1},f_{i-1,j-1})+1\ ...

  7. 【JZOJ4817】【NOIP2016提高A组五校联考4】square

    题目描述 输入 输出 样例输入 3 4 1 1 0 1 0 1 1 0 0 1 1 0 5 1 1 2 3 2 1 3 2 3 2 3 4 1 1 3 4 1 2 3 4 样例输出 1 1 1 2 2 ...

  8. 【NOIP2016提高A组五校联考4】ksum

    题目 分析 发现,当子段[l,r]被取了出来,那么[l-1,r].[l,r+1]一定也被取了出来. 那么,首先将[1,n]放入大顶堆,每次将堆顶的子段[l,r]取出来,因为它是堆顶,所以一定是最大的子 ...

  9. 【JZOJ4815】【NOIP2016提高A组五校联考4】ksum

    题目描述 输入 输出 样例输入 3 4 1 3 4 样例输出 8 7 4 4 数据范围 样例解释 解法 二分做法 考虑到可以二分第k大的值mid,如果比mid大的区间和数小于或等于mid,那么mid就 ...

随机推荐

  1. Hadoop生态圈-Kafka常用命令总结

    Hadoop生态圈-Kafka常用命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.管理Kafka服务的命令 1>.开启kafka服务 [yinzhengjie@s ...

  2. 网络获取json数据并解析

    1.升级流程分析

  3. Spark记录-Scala数组/List/Map/Set

    import Array._ import scala.collection.mutable.Set object DataStructure { def main(args:Array[String ...

  4. ThinkPHP框架学习(一)

    这几天呢,断断续续地在看孙叔华老师的ThinkPHP教程,期间还做了一些其他事情,出去办了点事,总结总结下一学期规划等等,不知不觉间又过去了大半个星期.现在呢,看完了一天的教程,在这里,还是希望稍微总 ...

  5. MySQL记录异常实体类设计

    public class LogInfo { /// <summary> /// 应用名 /// </summary> public string AppName { get; ...

  6. Python 入门基础1 --语言介绍

    本节目录: 一.编程语言介绍 二.python解释器介绍 三.安装python解释器 四.运行python程序的两种方式 五.变量 六.后期补充内容 一.编程语言介绍 1.机器语言: 直接用二进制编程 ...

  7. yui压缩JS和CSS文件

    CSS和JS文件经常需要压缩,比如我们看到的XX.min.js是经过压缩的JS. 压缩文件第一个是可以减小文件大小,第二个是对于JS文件,默认会去掉所有的注释,而且会去掉所有的分号,也会将我们的一些参 ...

  8. mybatis多对多关联查询——(十)

    1.需求 查询用户及用户购买商品信息. 2     sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表: orders.orderdetail. ...

  9. 洛谷 P4656: LOJ 2484: [CEOI2017]Palindromic Partitions

    菜菜只能靠写简单字符串哈希维持生活. 题目传送门:LOJ #2484. 题意简述: 题面讲得很清楚了. 题解: 很显然从两边往中间推,能选的就选上这个贪心策略是对的. 如何判断能不能选上,直接字符串哈 ...

  10. redis从入门到踩坑

    背景 Redis在互联网项目的使用也是非常普遍的,作为最常用的NO-SQL数据库,对Redis的了解已经成为了后端开发的必备技能.小编对Redis的使用时间不长,但是项目中确两次踩中了Redis的坑, ...