• [学习笔记]整数划分数


    定义

    P(i)把i划分成若干个整数的和的方案数。方案数不同当且仅当所用整数排序后不对应相同(存在某个整数用的次数不同)

    求法

    都是求前n项的每一项

    完全背包

    O(n^2)

    分块背包

    根据物品大小分块

    小于根号n的只有n种:
    f(i,j)前i个,j大小
    f(i,j)<-f(i-1,j-sz[i]*k)

    后面枚举k用一个前缀和优化

    O(nsqrt(n))

    大于根号n的最多用根号n个
    f(i,j)用了i个,j大小
    f(i,j)->f(i+1,j+sqrt(n))

    或者集体加1

    f(i,j)->f(i,j+i)

    道理是,初始认为是sqrt的,增长要靠集体加1,由于是“集体”所以必须操作有先后顺序,使得每个方案都恰好会被枚举到一次

    O(nsqrt(n))

    把第一维i都去掉(第一个直接去,第二个做前缀和)然后卷积一下即可。

    生成函数

    五边形数和整数拆分数

    递推整数拆分数方法:

    $F(x)Pi_i(1-x^i)=1$

    $F(x)(sum a_ix^i)=1$

    $(sum a_i f_{n-i} x^i)=1$

    观察第n项系数:(第n项系数等式右边是0)

    $[x^n]f_nsum_{i=1}^{n-1} a_i f_{n-i} =0$

    再对比五边形数:

    $Pi_i(1-x^i)=(sum a_ix^i)=sum_k (-1)^kx^frac{k(3k+1)}{2}$

    由于k也可以为负数,所以,只有当$i=frac{k(3k+1)}{2}$或者$frac{k(3k-1)}{2}$时才会有值

    求出ai,大概是$O(sqrt(n))$级别的,然后就得到了$O(sqrt(n))$递推式子

    (为啥是五边形数就不知道了。。。)

    应用

    Polya定理一些题,为了搞轮换会用到(一般就是dfs爆搜)

     以及:[HEOI2014]平衡

  • 相关阅读:
    腾讯实习前端工程师面经-一面-腾讯看点
    Redux的createStore实现
    GNU ARM 汇编基础
    python爬虫学习04-爬取贴吧
    python学习03-使用动态ua
    Python爬虫学习02--pyinstaller
    python爬虫学习01--电子书爬取
    简单的SQL语句学习
    微信小程序的五个生命周期函数
    python学习(12)使用正则表达式
  • 原文地址:https://www.cnblogs.com/Miracevin/p/10392750.html
Copyright © 2020-2023  润新知