【XSY1544】fixed 数学 强连通图计数
题目描述
给你一个\(n\times n\)的方阵\(A\)。定义方阵\(A\)的不动点\((i,j)\)为:\(\forall p,q\geq 0,(A^p)_{i,j}=(A^q)_{i,j}\)
求有多少个元素都在\([0,m)\)之间的\(n\)阶整数方正存在不动点。
对\(10^9+7\)取模。
\(n\leq 3000,m\leq {10}^9\)
题解
我们可以把方阵看成图\(G\)。\(a_{i,j}\)表示第\(i\)个点有多少条有向边连到第\(j\)个点。\(a^p_{i,j}\)表示有多少条从\(i\)出发经过\(p\)条边到达\(j\)的路径。
考虑\(a^0\),即单位矩阵。所以若不动点\((i,j)\)在主对角线上则\(a_{i,j}=1\),否则\(a_{i,j}=0\)。
有一个结论:这个方阵有不动点当且仅当这个图不是强连通图。
证明:
1.如果\(G\)不是强连通图,那么一定存在一组\((i,j)\)使得\(a^p_{i,j}=0\)。
2.如果\(G\)是强连通图,那么一定存在一个\(p\)使得\(a^p_{i,j}\neq 0\)。我们考虑\(a_{i,i}=1\)的情况,因为当\(a_{i,i}>1\)时当\(p=1\)时就不是不动点了。那么存在一个\(p\)使得第\(i\)个点走\(p\)条边回到第\(i\)点有至少两种走法:只走\(i\)->\(i\),或者在图上走一圈回到\(i\)。所以一定存在一个\(p\)使得\(a^p_{i,i}>1\)。所以方阵不存在不动点。
根据证明1,我们可以忽略自环(有没有自环不影响结果)。
现在我们要求的是\(n\)个点,任意两个点之间可以有\(0\)~\(m-1\)条边,存在多少种不同的非强连通图。
我们设\(f_i=i\)个点组成强连通图的方案数,\(g_{i,j}=i\)个点组成\(j\)个独立的强连通分量的方案数,\(g'_i=\sum_{j=1}^i{(-1)}^{j-1}g_{i,j},h_i=i\)个点组成的有向图个数。
先放公式:
\]
\]
\]
在\(g'_i=h_i−Σ_{j=1}^{i−1}(^i_j)m^{j(i−j)}h_{i−j}g'_j\)这个式子中,我们计算\(i\)个点不是相互独立的强连通图的数量,然后用\(h_i\)去减。枚举没有出边的强连通分量的点数之和,然后用容斥计算贡献。对于任意缩完点后DAG中仍然存在边的有向图,出度为\(0\)的强联通分量的点数总和一定小于\(i\),所以\(j\)从\(1\)枚举到\(i-1\)时能枚举到这些强联通块的所有子集。从而根据\(Σ_{j=0}^i(−1)^j(^i_j)=0\)(\(i\)是强联通块个数),该有向图被完全抵消。对于所有缩完点后联通块彼此独立的有向图(也就是\(g'_i\)要的那些东西),所有联通块的全集不会被计算到(因为这些联通块个数总和是\(i\),不在\(1\)到\(i-1\)的枚举范围内),所以会剩下来一项\((^i_i)\),根据\(\sum_{j=0}^i{(−1)}^j(^i_j)=0,\sum_{j=0}^{i-1}{(−1)}^j(^i_j)={(−1)}^{i−1}(^i_i)={(−1)}^{i−1}\),这一项的贡献恰好跟\(i\)的奇偶性有关,所以最后得出来的\(g'\)也是带符号的。
在\(f_i=g'_i+\sum_{j=1}^{i-1}(^{i-1}_{j-1})f_jg'_{i-j}\)这个式子中,我们枚举\(1\)所在的强连通分量的点数,算出\(\sum_{j=2}^i{(-1)}^jg_{i,j}\),然后用\(g'_i\)去加就可以得到\(g_{i,1}\),也就是\(f_i\)。
最后的答案就是非强连通图的数量乘上自环的贡献,也就是\((h_n-f_n)m^n\)。
时间复杂度:\(O(n^2)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
ll p=1000000007;
ll fp(ll a,ll b)
{
ll s=1;
while(b)
{
if(b&1)
s=s*a%p;
a=a*a%p;
b>>=1;
}
return s;
}
ll c[3010][3010];
ll f[3010];
ll g[3010];
ll h[3010];
ll pm[5000010];
int main()
{
ll n,m;
scanf("%lld%lld",&n,&m);
if(m<=1)
{
printf("0\n");
return 0;
}
if(n==1)
{
printf("1\n");
return 0;
}
int i,j;
memset(c,0,sizeof c);
c[0][0]=1;
for(i=1;i<=n;i++)
{
c[i][0]=1;
for(j=1;j<=i;j++)
c[i][j]=(c[i-1][j]+c[i-1][j-1])%p;
}
for(i=1;i<=n;i++)
h[i]=fp(m,i*(i-1));
pm[0]=1;
for(i=1;i<=n*n/2;i++)
pm[i]=pm[i-1]*m%p;
f[1]=1;
g[1]=1;
for(i=2;i<=n;i++)
{
g[i]=h[i];
for(j=1;j<i;j++)
g[i]=(g[i]-c[i][j]*pm[j*(i-j)]%p*h[i-j]%p*g[j]%p)%p;
f[i]=g[i];
for(j=1;j<i;j++)
f[i]=(f[i]+c[i-1][j-1]*f[j]%p*g[i-j]%p)%p;
}
ll ans=(h[n]-f[n])*pm[n]%p;
ans=(ans+p)%p;
printf("%lld\n",ans);
return 0;
}
【XSY1544】fixed 数学 强连通图计数的更多相关文章
- COGS 有标号的DAG/强连通图计数
COGS索引 一堆神仙容斥+多项式-- 有标号的DAG计数 I 考虑\(O(n^2)\)做法:设\(f_i\)表示总共有\(i\)个点的DAG数量,转移考虑枚举DAG上所有出度为\(0\)的点,剩下的 ...
- cojs 强连通图计数1-2 题解报告
OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...
- COGS 2396 2397 [HZOI 2015]有标号的强连通图计数
题意:求n个点有向图其中SCC是一个的方案数 考虑求出若干个不连通的每个连通块都是SCC方案数然后再怎么做一做.(但是这里不能用Ln,因为推不出来) 设$f_n$为答案, $g_n$为n个点的有向图, ...
- HDU 4588 Count The Carries (数学,计数)
题意:给定两个十进制数,求二进制中,从x加到y的二进制进了多少位. 析:把这些数字的二进制纵向罗列出来,然后一位一位的把和加起来,最终得到总的进位数.从1到x,第i位上1的总数是x左移i+1位再右移i ...
- 数学(GCD,计数原理)HDU 5656 CA Loves GCD
CA Loves GCD Accepts: 135 Submissions: 586 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 2621 ...
- 【XSY1537】五颜六色的幻想乡 数学 生成树计数 拉格朗日插值
题目大意 有一个\(n\)个点\(m\)条边的图,每条边有一种颜色\(c_i\in\{1,2,3\}\),求所有的包括\(i\)条颜色为\(1\)的边,\(j\)条颜色为\(2\)的边,\(k\) ...
- [BZOJ5305] [HAOI2018] 苹果树 数学 组合计数
Summary 题意很清楚: 小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点. 第一天的时候 ...
- 蒙特卡罗算法(Monte Carlo method)
蒙特卡罗方法概述 蒙特卡罗方法又称统计模拟法.随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法.将所求解的问题同一 ...
- 重拾java系列一java基础(1)
前言,不知不觉,从接触java到工作至今已有两年的时间,突然感觉自己的基础知识还很薄弱,有些知识虽然知道,但是停留在表面上,没有深挖,或者实践过,感觉掌握的很肤浅,而且时间一长,就觉得忘记了,我觉得这 ...
随机推荐
- 剑指offer--2.替换空格
题目: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路:可以使用replace或者 ...
- Win10系统如何安装Linux Mint
导读 随着windows10系统免费升级期限的靠近,越来越多朋友都将自己的电脑系统升级到了win10正式版.今天,小编就要在这里为大家分享Windows10系统安装Linux Mint的方法,希望能够 ...
- Day2 Numerical simulation of optical wave propagation之标量衍射理论基本原理(二)
2.麦克斯韦方程组的简单行波解 讨论通过线性.各向同性.均匀.无色散.无限电荷和电流的电介质材料的光波传输.在这种情况下,介质具有如下属性: (1)推导获得波动方程( 由麦克斯韦方程组导出的.描述电磁 ...
- Redis缓存用起来
Redis缓存用起来 1. 引言 创建任务时我们需要指定分配给谁,Demo中我们使用一个下拉列表用来显示当前系统的所有用户,以供用户选择.我们每创建一个任务时都要去数据库取一次用户列表,然后绑定到用户 ...
- nginx学习笔记二
一,nginx架构在Linux系统中以daemon(守护进程)的方式在后台运行,后台进程包含一个master进程和多个worker进程(多进程的工作方式) master进程 | 信号 | | ---- ...
- XManager&XShell如何保存登录用户和登录密码
Xshell配置ssh免密码登录 - qingfeng2556的博客 - CSDN博客https://blog.csdn.net/wuhenzhangxing/article/details/7948 ...
- windows下使用cmake编译zlib与libpng libjpeg
win7下使用VS2010编译jpeglib 1.下载源代码下载地址:http://www.ijg.org/files/, 选择最新版本的windows版本压缩包,进行下载. jpeg ...
- spring boot中的约定优于配置
Spring Boot并不是一个全新的框架,而是将已有的Spring组件整合起来. Spring Boot可以说是遵循约定优于配置这个理念产生的.它的特点是简单.快速和便捷. 既然遵循约定优于配置,则 ...
- [转帖]Docker的数据管理(volume/bind mount/tmpfs)
Docker(十五)-Docker的数据管理(volume/bind mount/tmpfs) https://www.cnblogs.com/zhuochong/p/10069719.html do ...
- Mission Impossible 6
题目:Mission Impossible 6 题目链接:http://hihocoder.com/problemset/problem/1228 题目大意: 大概就是让我们写一个代码模拟文本编辑器的 ...