zoukankan      html  css  js  c++  java
  • [bzoj 1025][SCOI2009]游戏(DP)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1025

    分析:首先这个问题等价于A1+A2+……Ak=n,求lcm(A1,A2,……,Ak)的种数

    考虑一个Lcm=p1^a1 * p2^a2 * …… pk^ak 是否可能出现

    WJMZBMR提出,能出现的充要条件是p1^a1+p2^a2+……+pk^ak<=n

    证明:

    先证必要性:

      ∵p1^a1 p2^a2 …… pk^ak 这k个数的最小公倍数正好是lcm 且 k<n (n以内的质数的个数肯定比n小啊)

      ∴可以把n分解成n=p1^a1 + p2^a2 …… +pk^ak + 1 + ……+1 (n-k个1),1对最小公倍数的大小lcm无影响

      ∴就存在这样的分解方案使得lcm能出现

    再证充分性:

      假设p1^a1+p2^a2+……+pk^ak>n

      看个例子:27=12+8+6+1=2*2*3+2*2*2+2*3+1

      他们的lcm=24=1^1 * 2^3 * 3^1

      这个lcm如何求出来的呢?我们看看2的指数如何定:12分解质因数有2个2,8分解质因数有3个2,6分解质因数有1个2,所以lcm中2的指数就是max{2,3,1}=3,  以3为底数的指数也是如此求法。也就是说lcm里的每个质数对应的指数是对n分解的每一项中该质数个数的最大值!!!!

      那么也就说对n的拆分里面,一定至少有一项含因子p1^a1,即对n的拆分里,一定至少有一项是p1^a1的倍数,同理也至少有一项分别是p2^a2 p3^a3 ……的  倍数,不妨设是b1*p1^a1 b2*p2^a2 ……

      那么现在p1^a1+p2^a2+……+pk^ak>n

      b1*p1^a1+b2*p2^a2+……+bk*pk^ak>n

      注意bi*pi^ai是n的拆分中的一项,所以b1*p1^a1+b2*p2^a2+……+bk*pk^ak=n

      很明显上面两个式子冲突了

      于是假设不成立,一定有p1^a1+p2^a2+……+pk^ak<=n

    综上所述,原问题等价于求满足p1^a1 + p2^a2 +…… pk^ak<=n的数列(a1,a2,...,ak)一共有多少个

    这显然就是背包问题了……GG

    这种神题只能欣赏了Orz……

  • 相关阅读:
    阅读 video in to axi4-stream v4.0 笔记
    python 字符串操作
    python 基本语句
    Python 算术运算符
    芯片企业研报阅读
    量化分析v1
    基于MATLAB System Generator 搭建Display Enhancement模型
    System Generator 生成IP核在Vivado中进行调用
    FPGA 中三角函数的实现
    System Generator 使用离散资源
  • 原文地址:https://www.cnblogs.com/wmrv587/p/3923533.html
Copyright © 2011-2022 走看看