codeforces111D. Petya and Coloring(组合数学,计数问题)
解题思路:
要求一条直线分割矩阵时左右颜色数一样,那么就说明一个问题。
直线左右移动时是不会改变左右矩阵的颜色集合的。
所以说明:2~m-1列的颜色集一定属于第一列与第m列颜色集的交集。
而且第一列与第m列颜色集大小相等。
显然需要预处理n个点m种颜色的方案数,设为$g(i,j)$
这样,只需要确定第一列和最后一列颜色集,假设交集是$i$种颜色,
就可以算出中间的颜色方案数:$i^{n*(m-2)}$
假设两边颜色个数都是$j$($j\ge i$)那么两边颜色的答案($(g(n,j)j!)^2$)
这$i$种颜色共有$C_k^i$种选法,两边各$j$种颜色,且只有$i$种颜色相同的方案就是:
$\Large C_k^iC_{k-i}^{2(j-i)}C_{2(j-i)}^{j-i}$
那么答案就是
$\Large\sum\limits_{i=1}^{n}\sum\limits_{j=i}^{n}C_k^iC_{k-i}^{2(j-i)}C_{2(j-i)}^{j-i}{(g(n,j)j!)^2}{i^{n(m-2)}}$
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
const lnt mod=;
lnt g[][];
lnt fac[];
lnt inv[];
int n,m,k;
lnt ans;
lnt ksm(lnt a,lnt b)
{
lnt ans=;
while(b)
{
if(b&)ans=ans*a%mod;
a=a*a%mod;
b=b/;
}
return ans;
}
lnt C(int x,int y)
{
if(y>x)return ;
return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
lnt squ(lnt x)
{
return x*x%mod;
}
int main()
{
g[][]=;
fac[]=inv[]=fac[]=inv[]=;
for(int i=;i<=;i++)
{
fac[i]=(fac[i-]*i)%mod;
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
for(int i=;i<=;i++)inv[i]=inv[i]*inv[i-]%mod;
scanf("%d%d%d",&n,&m,&k);
if(m==)
{
printf("%I64d\n",ksm(k,n));
return ;
}
for(int i=;i<=n;i++)
{
for(int j=;j<=i&&j<=k;j++)
{
g[i][j]=(g[i-][j-]+g[i-][j]*j)%mod;
}
}
for(int i=;i<=n;i++)
{
lnt tmp=ksm(i,n*(m-))*C(k,i)%mod;
for(int j=i;j<=n;j++)
{
ans=(ans+tmp*C(k-i,(j-i)*)%mod*C((j-i)*,j-i)%mod*squ(g[n][j]*fac[j]%mod)%mod)%mod;
}
}
printf("%I64d\n",(ans%mod+mod)%mod);
return ;
}
codeforces111D. Petya and Coloring(组合数学,计数问题)的更多相关文章
- cf111D Petya and Coloring 组合数学,二项式反演
http://codeforces.com/contest/111/problem/D Little Petya loves counting. He wants to count the numbe ...
- 2017/10 冲刺NOIP集训记录:暁の水平线に胜利を刻むのです!
前几次集训都没有记录每天的点滴……感觉缺失了很多反思的机会. 这次就从今天开始吧!不能懈怠,稳步前进! 2017/10/1 今天上午进行了集训的第一次考试…… 但是这次考试似乎是近几次我考得最渣的一次 ...
- codeforces 111D
题目链接 D. Petya and Coloring time limit per test 5 seconds memory limit per test 256 megabytes input s ...
- hdu 5738 2016 Multi-University Training Contest 2 Eureka 计数问题(组合数学+STL)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5738 题意:从n(n <= 1000)个点(有重点)中选出m(m > 1)个点(选出的点只 ...
- CF149D. Coloring Brackets[区间DP !]
题意:给括号匹配涂色,红色蓝色或不涂,要求见原题,求方案数 区间DP 用栈先处理匹配 f[i][j][0/1/2][0/1/2]表示i到ji涂色和j涂色的方案数 l和r匹配的话,转移到(l+1,r-1 ...
- CodeForces 149D Coloring Brackets
Coloring Brackets time limit per test: 2 seconds memory limit per test: 256 megabytes input: standar ...
- 置换群、Burnside引理与等价类计数问题
置换群.Burnside引理与等价类计数问题 标签: 置换群 Burnside引理 置换 说说我对置换的理解,其实就是把一个排列变成另外一个排列.简单来说就是一一映射.而置换群就是置换的集合. 比如\ ...
- Codeforces Round #106 (Div. 2) D. Coloring Brackets 区间dp
题目链接: http://codeforces.com/problemset/problem/149/D D. Coloring Brackets time limit per test2 secon ...
- 组合数学--Polya 原理及典型应用
Redfield-Polya (Pólya enumeration theorem,简称PET)定理是组合数学理论中最重要的定理之一.自从 1927 年 Redfield 首次运用 group red ...
随机推荐
- 面试题:Student s = new Student();在内存中做了哪些事情?即创建一个对象做了哪些事情
lStudent s = new Student();在内存中做了哪些事情? •载入Student.class文件进内存(方法区) •在栈内存为s开辟空间 •在堆内存为学生对象开辟空间 •对学生对象的 ...
- Mongodb集群之副本集
上篇咱们遗留了几个问题 1主节点是否能自己主动切换连接? 眼下须要手动切换 2主节点读写压力过大怎样解决 3从节点每一个上面的数据都是对数据库全量拷贝,从节点压力会不会过大 4数据压力达到机器支撑不了 ...
- js html 事件冒泡
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 安卓开发--AsyncTask
package com.cnn.asynctask; import android.app.Activity; import android.content.Intent; import androi ...
- BZOJ 1391 网络流
vis[0]没有清零查一年- //By SiriusRen #include <cstdio> #include <cstring> #include <algorith ...
- POJ TOYS(叉积的妙用+二分答案)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16042 Accepted: 7688 Description ...
- PHP+MySQL登录注册,完整版,详细注释
纯手写打造. 下载地址:http://download.csdn.net/detail/qq_33599520/9779970 项目结构: 下面是代码: <!DOCTYPE html> & ...
- solver及其配置
solver算是caffe的核心的核心,它协调着整个模型的运作.caffe程序运行必带的一个参数就是solver配置文件.运行代码一般为 # caffe train --solver=*_slover ...
- Unix版权史
原文出处: 阮一峰 这几天,我在读<Unix编程艺术>. 书中介绍了Unix的发展历史.我发现,这是一个很好的例子,说明现行版权制度具有阻碍社会发展的负面作用. 2. Unix诞生于 ...
- 1x1卷积核作用
1. 实现跨通道的交互和信息整合 对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量! 对多通道图像做1x1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把 ...