首页 > 其他分享 >[AtCoder Beginner Contest 281][G. Farthest City]

[AtCoder Beginner Contest 281][G. Farthest City]

时间:2023-03-17 10:46:17浏览次数:38  
标签:AtCoder cnt le Farthest Beginner 短路 times binom dis

CF1657E 的做法十分相似

题目链接:G - Farthest City

题目大意:问有多少个 \(n(3\le n\le 500)\) 个点的无向连通图满足,若设 \(1\) 到 \(i\) 的最短路距离为 \(dis_i\),则 \(dis_n\) 严格大于其它所有的 \(dis_i\)。输出方案数对 \(M(10^8\le M \le 10^9)\) 取模。

考虑最短路的值一定是连续的,那么若最短路为 \(i\) 的点数有 \(c_i\) 个,且 \(dis_n=k\),则方案数可以计算

\[Ans=\binom{n-2}{c_2,c_3,...,c_{k-1}}\times \prod_{i=1}^{k} (2^{c_{i-1}}-1)^{c_i}\times 2^{\binom{c_i}{2}} \]

其中,\(\sum_{i=0}^{k}c_i=n,c_0=c_k=1\)。\((2^{c_{i-1}}-1)^{c_i}\) 的含义为最短路为 \(i\) 的点是从最短路为 \(i-1\) 的点连接过来的,那么对于每个这样的点,他可以选择上一层的任意一个非空子集进行连接。\(2^{\binom{c_i}{2}}\) 的含义则是,对当前层的所有点,两两之间可以任意连接,对应可连接的边数为 \(\binom{c_i}{2}\),于是会有 \(2^{\binom{c_i}{2}}\) 的系数。

考虑背包,按最短路的值从小到大一批批安排当前点,那么有一个初始的 DP 想法,就是令 \(f_{i,j,k}\) 表示当前已经安排了 \(i\) 个点,目前最短路的最大值为 \(j\),对应点的个数为 \(k\) 的方案数,那么枚举最短路值为 \(j+1\) 的点的数量 \(cnt\),可以转移到 \(f_{i+cnt,j+1,cnt}\),转移系数为 \(\binom{n-1-i}{cnt}\times (2^{j}-1)^{cnt}\times 2^{\binom{cnt}{2}}\)。但是直接这样做是 \(O(n^4)\) 的。

发现转移系数与 \(j\) 无关,所以这一维可以直接省去,于是 DP 方式就变成,设 \(f_{i,j}\) 表示当前已经安排了 \(i\) 个点,且目前最短路最大的点数为 \(j\) 的方案数,那么同样枚举下一层的点数 \(k\),就能转移到 \(f_{i+k,k}\),转移系数为 \(\binom{n-1-i}{k}\times (2^{j}-1)^{k}\times 2^{\binom{k}{2}}\)。初始值设 \(f_{1,1}=1\),最后答案即为 \(\sum_{j=1}^{n-1} f_{n-1,j}\times (2^j-1)\)。

#include<bits/stdc++.h>
using namespace std;
#define N 510
#define LL long long
int n,MOD,f[N][N],c[N][N],p[N*N],ans;
LL qow(LL x,LL y){return y?(y&1?x*qow(x,y-1)%MOD:qow(x*x%MOD,y/2)):1;}
int main()
{
	scanf("%d%d",&n,&MOD);
	p[0]=c[0][0]=1;
	for(int i=1;i<=n;i++){
		c[i][0]=c[i][i]=1;
		for(int j=1;j<i;j++)
			c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD;
	}
	for(int i=1;i<=n*n;i++)p[i]=2ll*p[i-1]%MOD;
	f[1][1]=1;
	for(int i=1;i<n;i++)
	for(int j=1;j<=i;j++)if(f[i][j])
		for(int k=1;i+k<n;k++)
			f[i+k][k]=(f[i+k][k]+1ll*f[i][j]*c[n-i-1][k]%MOD*qow(p[j]+MOD-1,k)%MOD*p[k*(k-1)/2]%MOD)%MOD;
	for(int j=1;j<=n-1;j++)
		ans=(ans+1ll*f[n-1][j]*(p[j]+MOD-1)%MOD)%MOD;
	printf("%d\n",ans);
}

时间复杂度为 \(O(n^3 \log n)\),预处理了 \(2^i\) 的值稍微进行了点常数优化。实际上是可以通过 \(O(n^2)\) 预处理每个 \((2^j-1)^k\) 的值把复杂度降到 \(O(n^3)\) 的,但是既然能过就不优化了。╮(╯▽╰)╭

标签:AtCoder,cnt,le,Farthest,Beginner,短路,times,binom,dis
From: https://www.cnblogs.com/DeaphetS/p/17225744.html

相关文章

  • AtCoder Regular Contest 158
    Preface这场比赛刚好周日晚上没事就打了,堪堪混过三道题,也算是小上了一波分吧但是由于A题脑抽了一波卡了30min,导致排名不高,也没时间看DE了,属实有点可惜A-+3+5+7显......
  • AtCoder Beginner Contest 293
    题解报告基本的一些理解和问题都在注释中A:SwapOddandEven//水题#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>usingnamespace......
  • AtCoder Beginner Contest 240 F
    ABC240F思路维护前缀和B,以及B的前缀和C,然后在每次添加连续y个x的时候,从中找出最大的\(C_i\)(用pre记录),更新答案。有四种情况\(B\geq0,x>0\)那么新出现的\(C_i\)中......
  • atcoder ABC
    Ex-OptimalPathDecomposition题目只能给链染色,问你最短的(两点距离最大值),距离为不同颜色个数f[u],g[u],f表示u可以和father同一个颜色,g表示不可以。转移记录三个值。......
  • AtCoder Beginner Contest 272(D,E)
    AtCoderBeginnerContest272(D,E)DD这个题最主要的是需要找出有哪些移动的距离对于题目给出的\(m\),我们的移动过程可以是\((i-ii)^2+(j-jj)^2=m\)这样的话,我们可以......
  • AtCoder Beginner Contest 292-C D E
    C.FourVariables从正整数中,找出合适的ABCD,使得这个式子成立\(AB+CD=N\)。可以看到,A与B是相互关联的,C与D是相互关联的,所以我们可以在小于N的正整数中,找寻可以相加的两个......
  • Atcoder-ABC291 "Teleporter and Closed off" 动态DP版
    题目地址题意:在一个DAG图中,点i只有最多m条出边连向i+1~i+m(m<=10),边权均为1。对于\(k\in[2,n-1]\),依次输出当点k被删除时1到n的最短路。分析:标准做法无非就是预......
  • 容斥定理 AtCoder——FizzBuzz Sum Hard
    题目传送门ProblemStatementFindthesumofintegersbetween 1 and N(inclusive)thatarenotmultiplesof Aor B.Constraints1≤N,A,B≤109 Allvalue......
  • AtCoder Beginner Contest 292
    A-CAPSLOCK#include<bits/stdc++.h>usingnamespacestd;int32_tmain(){strings;cin>>s;for(autoi:s)cout<<char(i-'a'+......
  • AtCoder Beginner Contest 292
    《E-Transitivity》   这道题首先要看一下自己有没有理解错题意:      问:点2和点3之间要连边吗? 答案是不需......