m*n格填数方案
来源:互联网 发布:天眼软件下载 编辑:程序博客网 时间:2024/05/22 05:02
n*m格子每行和列至少填一格,求填格方案总数
关键词:容斥原理、模运算乘法溢出
Si设为i行不填数的方案,则:
根据容斥原理:
si和tj的交集元素个事容易计算,因此容易得到计算公式
#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<map>#include<vector>#include<queue>#include<stack>#define ll long long#define sf scanf#define pf printf#define INF 0x3f3f3f3f#define mem(a,b) memset(a,b,sizeof(a))#define lowbit(x) x&(-x)const ll mol=1000000007;using namespace std;ll n,m;ll g[1000],c[100][100];ll C(ll m,ll n){ if(c[m][n]) return c[m][n]%mol; if(n==0||m==n) return 1; return c[m][n]=(C(m-1,n)%mol+C(m-1,n-1)%mol)%mol;}ll quick_pow(ll a,ll b){ ll ans=1; while(b){ if(b&1) ans=(ans*a)%mol; b/=2; a=(a*a)%mol; } return (ans%mol);}int main(){ mem(c,0); while(scanf("%lld%lld",&n,&m)!=EOF){ mem(g,0); if(n==0||m==0) { printf("0\n"); continue; } ll ans=quick_pow(2,m*n); for(int i=0;i<=n;i++){//枚举i+j不如直接枚举i和j来的简便!!! for(int j=0;j<=m;j++){ if(i+j>0){ if((i+j)&1) ans=((ans-((C(n,i)*C(m,j))%mol*quick_pow(2,((n-i)*(m-j))%mol)))%mol+mol)%mol; else ans=((ans+((C(n,i)*C(m,j))%mol*quick_pow(2,((n-i)*(m-j)%mol)))%mol)%mol+mol)%mol; } } } printf("%lld\n",(ans+mol)%mol); }}
0 0
- m*n格填数方案
- 将整数m拆分为n个数字的有序拆分方案数为C(m-1,n-1)
- 输出n-m-n
- 递归加暴力打表,求c(n,m)中m种组合方案,总和为素数
- 求n个中选m个的方案数(dp)
- poj 1036 n!/(n-m)!*m!
- m选n算法
- M选N
- M*N的矩阵
- sigma(n^m)
- m的n次方
- 随机数产生 M-N
- C(m,n)
- poj2893 M × N Puzzle
- 组合C(m,n)
- m^n % 1003
- 求m,n最大公约数
- Decimal(m,n)
- 面试题4:替换空格
- Harry And Magic Box (dp题)
- Eclipse中设置代码和注释的模板
- 细说 exec 函数
- 那些开发中用到的模式——访问者模式
- m*n格填数方案
- 2014年底和之前同时讨论研发绩效考核的总结
- Java技术丛书
- Open-source Project官方地址
- hdoj 1040 sort排序
- 转载《WPF之Binding深入探讨》
- 【mfc】用对话框分页实现用户登录
- CGAL编程实现点集的Delaunay三角剖分和Voronoi图
- 【Software】通过google chrome下载网络视频的方法