CF995F Cowmpany Cowmpensation


Solution

这道题目可以看出我的代码能力是有多渣(代码能力严重退化)

我们先考虑dp,很容易写出方程:

设\(f_{i,j}\)表示以\(i\)为根的子树中\(i\)的值为\(j\),那么转移为:
\[
\begin{aligned}
f_{i,j}=\prod_{v\in son_u}\sum_{k=1}^j{f_{v,j}}
\end{aligned}
\]

这个东西很明显可以前缀和优化变成\(O(n^2)\)的求解.

当然不会告诉你我dp写挂了然后身败名裂啊

发现进一步的优化.

这个东西如果全用前缀和搞起来不就很像一个函数了?(把每一项出现的拆开考虑)

emmm,好像是的.

那么显然这个东西可以通过点值确定这个函数,然后就是喜闻乐见的拉格朗日插值了.

但是为什么可以成为一个可确定性的函数呢(就是复杂度比较合适).

考虑叶子节点如果有的话肯定是一次函数.

emmm,如果深度增加,显然就会高一次.

深度最大是\(n\),所以应该只要确定\(n\)个点就可以了.

那么就很愉快的写完了.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
#define int ll
inline int gi()
{
    int f=1,sum=0;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return f*sum;
}
const int N=3010,Mod=1e9+7;
int dp[N][N],front[N],to[N<<1],nxt[N<<1],cnt,sum[N][N],n,x[N],y[N];
int Pow(int a,int b)
{
    int ret=1;
    while(b)
    {
        if(b&1)ret=(ret*a)%Mod;
        a=(a*a)%Mod;b>>=1;
    }
    return ret;
}
int lalr(int k)
{
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        int Up=1,Down=1;
        for(int j=0;j<=n;j++)
            if(i!=j)
            {
                (Up*=(k-x[j]))%=Mod;
                (Down*=(x[i]-x[j]))%=Mod;
            }
        (ans+=(y[i]*Up)%Mod*Pow(Down,Mod-2))%=Mod;
    }
    return ans;
}
void Add(int u,int v)
{
    to[++cnt]=v;nxt[cnt]=front[u];front[u]=cnt;
}
void dfs(int u)
{
    for(int i=1;i<=n;i++)dp[u][i]=1;
    for(int i=front[u];i;i=nxt[i])
    {
        int v=to[i];
        dfs(v);
        for(int j=1;j<=n;j++)
            dp[u][j]=(ll)dp[u][j]*dp[v][j]%Mod;
    }
    for(int i=1;i<=n;i++)
        dp[u][i]=(dp[u][i]+dp[u][i-1])%Mod;
}
void init()
{
    dfs(1);
}
signed main()
{
    int d;
    n=gi();d=gi();
    for(int i=2;i<=n;i++)
    {
        int Fa=gi();
        Add(Fa,i);
    }
    init();
    if(d<=n)return printf("%lld\n",dp[1][d]),0;
    for(int i=1;i<=n;i++)x[i]=i,y[i]=dp[1][i];
    printf("%lld\n",lalr(d));
    return 0;
}

【CF995F】 Cowmpany Cowmpensation的更多相关文章

  1. 【CF995F】Cowmpany Cowmpensation(动态规划,拉格朗日插值)

    [CF995F]Cowmpany Cowmpensation(多项式插值) 题面 洛谷 CF 题解 我们假装结果是一个关于\(D\)的\(n\)次多项式, 那么,先\(dp\)暴力求解颜色数为\(0. ...

  2. 【CF995F】Cowmpany Cowmpensation

    [CF995F]Cowmpany Cowmpensation 题面 树形结构,\(n\)个点,给每个节点分配工资\([1,d]\),子节点不能超过父亲节点的工资,问有多少种分配方案 其中\(n\leq ...

  3. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  4. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  5. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  8. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  9. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

随机推荐

  1. java面试感悟【一】

    我最终选择不包装工作经验,或许是因为我怂,或许是因为一些莫名其妙的坚持…… 然而结果就是在boss上沟通了20多家,只有7家让我投了简历,1家跟我说要我发个时间段给他稍后告诉我面试时间,然后就没有然后 ...

  2. vb中去掉string数组的一部分

    今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBir ...

  3. 关于传统项目打成war包的的分析

    技术在不断的革新,以前的项目没有jar管理工具时,都是手动将依赖的jar拷贝到项目之下,然后Build Path,之后Maven出现了,出现了jar包中央仓库,所有的jar包资源集中在这里,免去频繁去 ...

  4. 关于Rigidbody,Collider和CharacterController三者之间的关系和用法的总结

    Rigidbody:多用在“物体”上,因为“物体”都是“死”的,他们的运动一般都是靠物理系统.所以对于Rigidbody的移动,不要用Translate(),要用各种“力”, 比如:Rigidbody ...

  5. android检测手机是否安装某个app

    public static boolean isAvilible(Context context, String packageName){ //获取packagemanager final Pack ...

  6. Win7 IIS 部署站点遇到的问题 如 HTTP 错误 404.XX

    HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面. 解决办法:设置为允许-面相 =============== ...

  7. java.io.IOException: Can't read [\jre\lib\rt.jar]

    [proguard] java.io.IOException: Can't read [F:\e\java\jdk1.8.0_101\jre\lib\rt.jar] (Can't process cl ...

  8. python advanced programming ( I )

    函数式编程 函数是Python内建支持的一种封装,通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基 ...

  9. android-基础编程-Preference

    由于SDK封装和提供了一套基于Preference的类,使用Preference通过编辑xml配置文件,只要很少的代码就可以实现了,而且Preference本身已经实现了参数保存,不需要我们再考虑将参 ...

  10. ZUFE2483 DO IT YOURSELF 2017-05-31 14:41 40人阅读 评论(0) 收藏

    2483: DO IT YOURSELF 时间限制: 2 Sec  内存限制: 128 MB 提交: 8  解决: 3 [提交][状态][讨论版] 题目描述 有四个字符串S,T,tmp,ans,一开始 ...