码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj5219 [Lydsy2017省队十连测]最长路径 (DP)

时间:2018-04-12 13:32:05      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:algo   iostream   tput   put   pre   sar   can   居住   submit   

5219: [Lydsy2017省队十连测]最长路径

Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 44 Solved: 26
[Submit][Status][Discuss]

Description

在Byteland一共有n个城市,编号依次为1到n,它们之间计划修建n(n-1)/2条单向道路,对于任意两个不同的点i和j,在它们之间有且仅有一条单向道路,方向要么是i到j,要么是j到i。换句话说,这是一个n个点的竞赛图。Byteasar居住在1号城市,他希望从1号城市出发,沿着单向道路不重复地访问一些城市,使得访问的城市数尽可能多。请写一个程序,帮助Byteasar计算有多少种道路修建方式,使得从1号点出发的最长简单路径经过点数恰好为k,由于答案可能很大,请对P取模输出。

Input

第一行包含两个正整数n,P,表示点数和模数。
2≤P≤1e9,N<=2000

Output

输出n行,第i行输出从1出发的最长简单路径经过点数恰好为i的竞赛图个数模P。


最长路径长度为\(k\)的图一定能分成\(A\)(包含\(1\),共\(k\)个点)和\(B\)两部分,\(AB\)间连边一定是\(B\)->\(A\)
\(dp\)一下,\(dp[i][j]\)表示共\(i\)个点,最长路径长度为\(j\)的竞赛图个数;
\(dp[i][j]=dp[j][j]*C_{i-1}^{j-1}*2^{(i-j)*(i-j-1)/2}\)
\(dp[i][i]=2^{i*(i-1)/2}-\sum_{j=1}^{i-1}dp[i][j]\)
就是选出\(j-1\)个点与\(1\)构成\(A\),剩下\(B\)内部的边随便连;
\(dp[i][i]\)的话用所有的减去不合法的就行了;
AC GET☆DAZE

#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define N 2039
#define mod 20070831
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
int n,p,pw[N*N],C[N][N],dp[N][N];
void get_pw()
{
    pw[0]=1;
    for(int a=1,b=n*(n-1)/2;a<=b;a++) pw[a]=pw[a-1]*2%p;
}
void get_C()
{
    for(int a=0;a<=n;a++) C[a][0]=1;
    for(int a=1;a<=n;a++)
    {
        for(int b=1;b<=a;b++)
        {
            C[a][b]=(C[a-1][b]+C[a-1][b-1])%p;
        }
    }
}
int main()
{
    scanf("%d%d",&n,&p);
    get_pw(),get_C();
    for(int a=1;a<=n;a++)
    {
        dp[a][1]=pw[(a-1)*(a-2)/2];
        for(int b=2;b<a;b++)
        {
            dp[a][b]=(ll)dp[b][b]*C[a-1][b-1]%p*pw[(a-b)*(a-b-1)/2]%p;
        }
        dp[a][a]=pw[a*(a-1)/2];
        for(int b=1;b<a;b++) (dp[a][a]-=dp[a][b])%=p;
        (dp[a][a]+=p)%=p;
    }
    for(int a=1;a<=n;a++)
    {
        printf("%d\n",dp[n][a]);
    }
    return 0;
}

bzoj5219 [Lydsy2017省队十连测]最长路径 (DP)

标签:algo   iostream   tput   put   pre   sar   can   居住   submit   

原文地址:https://www.cnblogs.com/Sinogi/p/8806706.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!