比较水的一题。居然是一道没看题解就会做的黑题……

题目链接:洛谷

题目大意:定义一个长度为 $m$ 的正整数序列 $a$ 的价值为 $\prod f_{a_i}$。($f$ 是斐波那契数)对于每一个 $\sum a_i=n$ 的正整数序列,求出它们的价值之和。

$1\le n\le 10^6$。


这题一看就是生成函数瞎搞。

令 $F$ 为 $f$ 的生成函数。

那么有 $F=x\times F+x^2\times F+x$。

就有 $F=\dfrac{x}{1-x-x^2}$。

答案即为 $\sum^{\infty}_{i=0}F^i(x)[x^n]$。(注意的是不是 $F^n(x)[x^n]$,因为 $f_0=0$)

等比数列:$\dfrac{1}{1-F(x)}[x^n]$。

套进去:

$$\dfrac{1}{1-\dfrac{x}{1-x-x^2}}[x^n]$$

$$\dfrac{1-x-x^2}{(1-x-x^2)-x}[x^n]$$

$$\dfrac{1-2x-x^2+x}{1-2x-x^2}[x^n]$$

$$(1+\dfrac{x}{1-2x-x^2})[x^n]$$

$$\dfrac{x}{1-2x-x^2}[x^n]$$

这个生成函数似乎与 $F$ 长得有点像……令它为 $G$,是数列 $g$ 的生成函数。要求即为 $g[n]$。

$(1-2x-x^2)G=x$

$G=2x\times G+x^2\times G+x$

那么就有 $g[0]=0,g[1]=1,g[i]=2g[i-1]+g[i-2](i\ge 2)$。

此时可以用矩阵快速幂做到 $O(\log n)$。但是这么小的 $n$……

时间复杂度 $O(n)$。

#include<bits/stdc++.h>
using namespace std;
const int maxn=,mod=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,g[maxn];
int main(){
n=read();
g[]=;g[]=;
FOR(i,,n) g[i]=(2ll*g[i-]+g[i-])%mod;
printf("%d\n",g[n]);
}

洛谷4451 整数的lqp拆分(生成函数)的更多相关文章

  1. 洛谷P4451 [国家集训队]整数的lqp拆分 [生成函数]

    传送门 题意简述:语文不好不会写,自己看吧 思路如此精妙,代码如此简洁,实是锻炼思维水经验之好题 这种题当然是一眼DP啦. 设\(dp_n\)为把\(n\)拆分后的答案.为了方便我们设\(dp_0=1 ...

  2. [BZOJ2173]整数的lqp拆分

    [题目描述] lqp在为出题而烦恼,他完全没有头绪,好烦啊… 他首先想到了整数拆分.整数拆分是个很有趣的问题.给你一个正整数N,对于N的一个整数拆分就是满足任意m>0,a1 ,a2 ,a3…am ...

  3. BZOJ 2173: 整数的lqp拆分( dp )

    靠着暴力+直觉搞出递推式 f(n) = ∑F(i)f(n-i) (1≤i≤n) (直接想大概也不会很复杂吧...). f(0)=0 感受一下这个递推式...因为和斐波那契有关..我们算一下f(n)+f ...

  4. BZOJ 2173 luoguo P4451 [国家集训队]整数的lqp拆分

    整数的lqp拆分 [问题描述] lqp在为出题而烦恼,他完全没有头绪,好烦啊… 他首先想到了整数拆分.整数拆分是个很有趣的问题.给你一个正整数N,对于N的一个整数拆分就是满足任意m>0,a1 , ...

  5. 打表\数学【bzoj2173】: 整数的lqp拆分

    2173: 整数的lqp拆分 Description lqp在为出题而烦恼,他完全没有头绪,好烦啊- 他首先想到了整数拆分.整数拆分是个很有趣的问题.给你一个正整数N,对于N的一个整数拆分就是满足任意 ...

  6. 整数的lqp拆分

    题目大意 lqp在为出题而烦恼,他完全没有头绪,好烦啊… 他首先想到了整数拆分.整数拆分是个很有趣的问题.给你一个正整数N,对于N的一个整数拆分就是满足任意m>0,a1 ,a2 ,a3…am&g ...

  7. 洛谷 P4451 [国家集训队]整数的lqp拆分

    洛谷 这个题目是黑题,本来想打表的,但是表调不出来(我逊毙了)! 然后随便打了一个递推,凑出了样例, 竟然. 竟然.. 竟然... A了!!!!!!! 直接:\(f[i]=f[i-1]*2+f[i-2 ...

  8. BZOJ2173 整数的lqp拆分(生成函数)

    首先有序整数拆分有个显然的递推式是g(n)=Σg(i) (i=0~n-1),即枚举加入最后一个数之前和是多少.(虽然不用递推式也能显然地知道答案是2n-1). 类似地,lqp拆分有递推式f(n)=Σf ...

  9. Luogu4451 [国家集训队]整数的lqp拆分

    题目链接:洛谷 题目大意:求对于所有$n$的拆分$a_i$,使得$\sum_{i=1}^ma_i=n$,$\prod_{i=1}^mf_{a_i}$之和.其中$f_i$为斐波那契数列的第$i$项. 数 ...

随机推荐

  1. php开发之常用验证方法

    1.邮箱验证 function isEmail($email) { if (!$email) { return false; } return preg_match('/^[_\.0-9a-z-]+@ ...

  2. md5加密通过URL传给后台

    首先要把你要用的md5库引入 这个技术其实挺简单的,咋们直接贴上代码(这个是项目上的) sign = hex_md5("type="+type&"userId=& ...

  3. POJ_1185_炮兵阵地 dp+状态压缩

    题目:炮兵阵地 链接:http://poj.org/problem?id=1185 解题思路: 首先用 int 来表示每一行的情况,比如说第一行是k1,那么[ k1&(k1>>2) ...

  4. Collections斗地主案例

    package com.zhangxueliang.doudizhu; import java.util.ArrayList; import java.util.Collections; public ...

  5. leetcode:Roman to Integer and Integer to Roman

    2015-06-03 罗马数字以前接触过I到VIII比较多,直到遇见这个题目才知道更详细.阿拉伯数字和罗马数字之间的转换最重的是了解罗马数字的规则. 罗马数字规则:(总结) 1, 罗马数字共有7个,即 ...

  6. Flutter的Appbar

    actions → List一个 Widget 列表,代表 Toolbar 中所显示的菜单,对于常用的菜单,通常使用 IconButton 来表示:对于不常用的菜单通常使用PopupMenuButto ...

  7. centos安装Tesseract

    yum安装(推荐) yum search tesseract yum install tesseract.x86_64 -y pip3 install pytesseract pip3 install ...

  8. 存储过程中的 SET XACT_ABORT ON 和事务

    在存储过程中写SET XACT_ABORT ON 有什么用? SET XACT_ABORT ON是设置事务回滚的!当为ON时,如果你存储中的某个地方出了问题,整个事务中的语句都会回滚为OFF时,只回滚 ...

  9. CS新建排版

    1.拉菜单栏barmanage,去掉不要的头部和尾部  ,选择控件bar属性optionsbar 全部为false,防止菜单拖动. 2.拉一个panelcontrol属性dock 设置顶部,在拉一个p ...

  10. codeforces347B

    Fixed Points CodeForces - 347B A permutation of length n is an integer sequence such that each integ ...