五校联考R1 Day2T2 矩阵matrix(容斥)
容易想到容斥,但是很恶心,因为要对行和列都容斥,然后行+列又要容斥。。
于是得到\(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(容斥)的更多相关文章
- 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)
题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...
- 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你
[五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...
- 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底
[五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...
- 五校联考模拟赛Day2T2矩阵(容斥原理)
题意 $n * m$的网格,对其进行黑白染色,问每一行每一列至少有一个黑格子的方案数. Sol 考场上只会$n^3$的dp,还和指数级枚举一个分qwq 设$f[i][j]$表示到了第$i$行,已经有$ ...
- 【2020五校联考NOIP #2】矩阵
咕咕咕到现在~ 题面传送门 题意: 给出一个 \(n\times n\) 的矩阵 \(A\).要你求有多少个 \(n\times n\) 的矩阵 \(B\) 满足: 每一行都是 \(1\) 到 \(n ...
- 【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\ ...
- 【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 ...
- 【NOIP2016提高A组五校联考4】ksum
题目 分析 发现,当子段[l,r]被取了出来,那么[l-1,r].[l,r+1]一定也被取了出来. 那么,首先将[1,n]放入大顶堆,每次将堆顶的子段[l,r]取出来,因为它是堆顶,所以一定是最大的子 ...
- 【JZOJ4815】【NOIP2016提高A组五校联考4】ksum
题目描述 输入 输出 样例输入 3 4 1 3 4 样例输出 8 7 4 4 数据范围 样例解释 解法 二分做法 考虑到可以二分第k大的值mid,如果比mid大的区间和数小于或等于mid,那么mid就 ...
随机推荐
- Java基础-原码反码补码
Java基础-原码反码补码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 注意,我们这里举列的原码和反码只是为了求负数的补码,在计算机中没有原码,反码的存在,只有补码. 一.原码 ...
- sql数据库连接字符串在APP.config配置文件内的两种写法
第一种方法 写法: <configuration> <appSettings> <add key="connectionstring" value=& ...
- 利用fiddler来模拟低速环境
为了让我们的站点拥有更好的用户体验,更短的加载时间,我们会“按需加载”页面的资源. 在调试程序的时候,我们希望能有一个低速率的网络环境来模拟真实线上的环境,这个时候fiddler(下载fiddler请 ...
- Unable to Distribute in Xcode5?
Blog Unable to Distribute in Xcode5? I have the question, if this screenshot is what you getting. ( ...
- [转]C++11 随机数学习
相对于C++ 11之前的随机数生成器来说,C++11的随机数生成器是复杂了很多.这是因为相对于之前的只需srand.rand这两函数即可获取随机数来说,C++11提供了太多的选择和东西. 随机数生成算 ...
- [转]python ctypes 探究 ---- python 与 c 的交互
近几天使用 python 与 c/c++ 程序交互,网上有推荐swig但效果都不理想,所以琢磨琢磨了 python 的 ctypes 模块.同时,虽然网上有这方面的内容,但是感觉还是没说清楚.这里记录 ...
- Linux DRM KMS 驱动简介【转】
转自:https://blog.csdn.net/yangkuanqaz85988/article/details/48689521 Whoops,上次写完<Linux DRM Graphic ...
- linux批量关闭进程
ps aux | grep gunicorn_api | awk '{print $2}' | xargs kill -9 gunicorn 换成你的关键字即可.
- windows下使用pip安装python模块lxml
pip install lxml 1 1 会有如下问题: 结果一路解决下去,解决了一个坑还是有一个坑,遂放弃,查找有没有别的解决办法. 亲测使用wheel+pip可以成功安装lxml! wheel本 ...
- dblinks
一.Oracle数据库链Database links的作用 当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本 ...