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

SOL:

同JZOJ5061

#include<bits/stdc++.h>
#define LL long long
#define N 3007
using namespace std;
LL n,mo,c[N][N],f[N],g[N],anw[N];
inline LL qsm(LL x,LL y) {
    static LL anw;
    for (anw=1;y;y=y>>1,x=x*x%mo) if (y&1) anw=anw*x%mo;
    return anw;
}
signed main () {
    scanf("%lld%lld",&n,&mo);
    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-1]+c[i-1][j])%mo;
    }
//   for (int i=1;i<=n;i++) {
//      for (int j=0;j<=i;j++) cerr<<c[i][j]<<" ";
//      puts("");
//  }
    for (int i=0;i<=n;i++) f[i]=qsm(2,i*(i-1)/2);
//  for (int i=0;i<=n;i++) cerr<<f[i]<<‘ ‘; puts("");
    g[1]=1;
    for (int i=2;i<=n;i++) {
        g[i]=f[i];
        for (int j=1;j<i;j++) g[i]-=c[i][j]*g[j]%mo*f[i-j]%mo,g[i]=(g[i]%mo+mo)%mo;
    }
//  for (int i=0;i<=n;i++) cerr<<g[i]<<‘ ‘;
    for (int i=1;i<=n;i++)
     for (int j=0;i+j<=n;j++)
      anw[i+j]+=f[n-i-j]*f[j]%mo*c[n-1][i-1]%mo*c[n-i][j]%mo*g[i]%mo
      ,anw[i+j]%=mo;
    for (int i=1;i<=n;i++) printf("%lld\n",anw[i]);
}

原文地址:https://www.cnblogs.com/rrsb/p/9126910.html

时间: 2024-10-12 15:23:20

[Lydsy2017省队十连测]最长路径的相关文章

[Lydsy2017省队十连测]商店购物

SOL: 我们可以前面写背包,后面组合数. #include<bits/stdc++.h> #pragma GCC optimize("-O2") #define mo 1000000007 #define N 10000007 #define LL long long using namespace std; #define sight(x) ('0'<=x&&x<='9') inline void read(LL &x){ stati

[BZOJ]2017省队十连测推广赛1

听学长说有比赛就随便打一打. A.普通计算姬 题目大意:给出一棵带权树,支持一下两种操作:1.修改一个点的权值:2.给出l,r,询问以点l为根的子树和.点l+1为根的子树和.点l+2为根的子树和--点r为根的子树和的总和.(点数.操作数不超过10^5) 思路:感觉是三题中最难的.给出的[l,r]区间在树上没有实际意义,不好利用数据结构维护.考虑若不修改,可以一遍dfs算出每个点对应的dfs序,这样每棵子树都对应一个dfs序的区间,前缀和一下就能O(1)查子树和,再按点的编号顺序把子树和前缀和一下

bzoj [ 2017省队十连测推广赛1 ] ( 4765 &amp;&amp; 4766 &amp;&amp; 4767 )题解

bzoj 4765 -- 分块+dfs序+树状数组: 考虑分块.将1~n分成sqrt(n)块,对每个点记录它在每个块中的祖先个数,修改一个点时枚举每一块修改. 查询[l,r]时如果一个块在[l,r]中,直接将其加入答案.显然只剩下O(sqrt(n))个点.求出树的dfs序,用树状数组维护就可以O(logn)求出答案. 时间复杂度O(n*sqrt(n)*logn) 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cs

【leetcode 简单】 第九十六题 最长回文串

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字符串的长度不会超过 1010. 示例 1: 输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7. class Solution(object): def longestPalindrome(self, s): &quo

Noi2016十连测第二场-黑暗 (二项式定理/斯特林数+CDQ+NTT)

Noi2016十连测第二场-黑暗 (二项式定理/斯特林数+CDQ+NTT) 题意: n 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 m 次方,求所有可能的图的权值和. 考虑\(dp[i][j]\)表示\(j\)个点,权值为\(i\)次方 我们首先要预处理出\(n\)个点无向联通图的数量\(g[i]\),模板题:BZOJ-3456 题解 对于\(dp[i][j]\),枚举\(1\)号点所在的连通块大小为\(x\),那么可以得到的是\(dp[i][j]=\sum dp[k][j-x]

014-字串的连接最长路径查找

/* 014-字串的连接最长路径查找 题目描述 给定n个字符串,请对n个字符串按照字典序排列.  输入描述: 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母. 输出描述: 数据输出n行,输出结果为按照字典序排列的字符串. 输入例子: 9 cap to cat card two too up boat boot 输出例子: boat boot cap card cat to too two up */ //c语言版  #inclu

二叉树中节点的最大距离(树的最长路径)——递归解法

上一篇文章说的是该题的一种变形,并给出了非递归解法. 现在我给出原题的一种递归解法.将会看到,现比较上篇博文,今天给出的递归解法的代码实现是相当简洁的. 问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \    

树中的最长路径

问题分析: 树中的路径,即是从树上的某个节点起,经过某个转折节点,到达另一个节点这样一条路径.而最长路径就是要找出这些路径中最长的那一条. 算法思路: 对于每个节点,记录下以该节点为根节点的子树中从该节点开始到所有叶子节点的路径中最长的那一条路径长度d1以及次长的那一条路径长度d2(最长和次长两条路径无公共边).那么对于我们想要解决的问题(树中的最长路径),就只需要枚举每个节点作为转折节点,求出所有d1+d2中的最大值. 关于d1,d2的求解: 对于任意一个节点,其d1值等于其所有子节点最大d1

变形二叉树中节点的最大距离(树的最长路径)——非递归解法

问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \         /   \ n6    n7    n8    n9 /                       / n10