题目描述

​  给你一个\(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\)个点组成的有向图个数。

​   先放公式:

\[h_i=m^{i(i-1)}
\]

\[g'_i=h_i-\sum_{j-1}^{i-1}(^i_j)m^{j(i-j)}h_{i-j}g'_j
\]

\[f_i=g'_i+\sum_{j=1}^{i-1}(^{i-1}_{j-1})f_jg'_{i-j}
\]

​  在\(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 数学 强连通图计数的更多相关文章

  1. COGS 有标号的DAG/强连通图计数

    COGS索引 一堆神仙容斥+多项式-- 有标号的DAG计数 I 考虑\(O(n^2)\)做法:设\(f_i\)表示总共有\(i\)个点的DAG数量,转移考虑枚举DAG上所有出度为\(0\)的点,剩下的 ...

  2. cojs 强连通图计数1-2 题解报告

    OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...

  3. COGS 2396 2397 [HZOI 2015]有标号的强连通图计数

    题意:求n个点有向图其中SCC是一个的方案数 考虑求出若干个不连通的每个连通块都是SCC方案数然后再怎么做一做.(但是这里不能用Ln,因为推不出来) 设$f_n$为答案, $g_n$为n个点的有向图, ...

  4. HDU 4588 Count The Carries (数学,计数)

    题意:给定两个十进制数,求二进制中,从x加到y的二进制进了多少位. 析:把这些数字的二进制纵向罗列出来,然后一位一位的把和加起来,最终得到总的进位数.从1到x,第i位上1的总数是x左移i+1位再右移i ...

  5. 数学(GCD,计数原理)HDU 5656 CA Loves GCD

    CA Loves GCD Accepts: 135 Submissions: 586 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 2621 ...

  6. 【XSY1537】五颜六色的幻想乡 数学 生成树计数 拉格朗日插值

    题目大意 ​ 有一个\(n\)个点\(m\)条边的图,每条边有一种颜色\(c_i\in\{1,2,3\}\),求所有的包括\(i\)条颜色为\(1\)的边,\(j\)条颜色为\(2\)的边,\(k\) ...

  7. [BZOJ5305] [HAOI2018] 苹果树 数学 组合计数

    Summary 题意很清楚: 小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点. 第一天的时候 ...

  8. 蒙特卡罗算法(Monte Carlo method)

    蒙特卡罗方法概述 蒙特卡罗方法又称统计模拟法.随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法.将所求解的问题同一 ...

  9. 重拾java系列一java基础(1)

    前言,不知不觉,从接触java到工作至今已有两年的时间,突然感觉自己的基础知识还很薄弱,有些知识虽然知道,但是停留在表面上,没有深挖,或者实践过,感觉掌握的很肤浅,而且时间一长,就觉得忘记了,我觉得这 ...

随机推荐

  1. python-Requests + 正则表达式爬取猫眼电影

    github: https://github.com/LXL-YAN/Requests_Regular-Expressions-Crawl-CatEye-Movies

  2. c++入门之输出文件流ofstream

    # include "iostream" # include"fstream" int main() { using namespace std; ]; int ...

  3. elk之查询方式(4种)

    es 在查询时, 可以指定搜索类型为下面四种: QUERY_THEN_FETCH QUERY_AND_FEATCH DFS_QUERY_THEN_FEATCH DFS_QUERY_AND_FEATCH ...

  4. 有界算子p129

    ? 如果我把这里的1改成2,把1/(a-b) 换成1/2(a-b) 为什么不能是? 2. 这里的x是关于t的函数,为什么x属于 结果了?和x应该没有关系呀? 3. 那为什么T的范数不是一个固定值?为什 ...

  5. 个人项目 Individual Project

    通讯录中的联系人包含以下信息项:姓名.手机.办公电话.家庭电话.电子邮箱.所在省市.工作单位.家庭住址,群组分类(亲属.同事.同学.朋友.其他). 系统的主要功能包括: 1. 输入联系人的信息,要求: ...

  6. 【学习总结】Git学习-参考廖雪峰老师教程四-时光机穿梭

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  7. vue单页面模板说明文档(1)

    Introduction This boilerplate is targeted towards large, serious projects and assumes you are somewh ...

  8. java.lang(StringBuffer)

    public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharS ...

  9. [转帖] BMC安全隐患

    BMC再现漏洞,裸金属云服务器岌岌可危 https://zhuanlan.kanxue.com/article-8006.htm 之前有vt-x 可能有隐患 现在看起来BMC 也就是IPMI 也有隐患 ...

  10. idea 最新破解亲测有效

    选择License serverLicense server address: 填:http://active.chinapyg.com/ (不能用了) 2018-5-7更新 新增一个 http:// ...