BZOJ2173 整数的lqp拆分(生成函数)
2024-10-14 22:38:54
首先有序整数拆分有个显然的递推式是g(n)=Σg(i) (i=0~n-1),即枚举加入最后一个数之前和是多少。(虽然不用递推式也能显然地知道答案是2n-1)。
类似地,lqp拆分有递推式f(n)=Σf(i)fib(n-i) (i=0~n-1)。由乘法分配律就可以推出。特别地,f(0)=1。
又是一个卷积。是不是可以直接算了?啊要分治FFTn有1e6而且还不是NTT模数……肯定跑不过去啊。于是考虑生成函数。
设其生成函数为F(x),斐波拉契数列的生成函数为FIB(x)。则F(x)=F(x)·FIB(x)+1。因为f(0)=1是我们的特殊规定所以补上1。即有F(x)=1/(1-FIB(x))。
考虑求出FIB(x)的有限表示。可以把fib(n)的递推式也看做卷积。设a1=1,a2=1,则有fib(n)=Σfib(i)a(n-i) (i=0~n-1)。而a的生成函数为A(x)=x+x2。那么有FIB(x)=FIB(x)·A(x)+x。有FIB(x)=x/(1-A(x))=x/(1-x-x2)。于是代入得F(x)=1/[1-x/(1-x-x2)]=1-x/(x2+2x-1)。
这个求出来……多项式求逆?照样爆炸啊。
据说可以用特征根。然而那是啥玩意啊?
推了半天……不如打表!
则显然f(n)=2f(n-1)+f(n-2)。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define P 1000000007
#define N 1000010
int n,f[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2173.in","r",stdin);
freopen("bzoj2173.out","w",stdout);
const char LL[]="%I64d";
#else
const char LL[]="%lld";
#endif
n=read();
f[]=,f[]=;
for (int i=;i<=n;i++) f[i]=((f[i-]<<)%P+f[i-])%P;
cout<<f[n];
return ;
}
最新文章
- C++之路进阶——codevs3333(高级打字机)
- Linux学习笔记(二)
- php学习笔记-基础篇
- html-div中内容自动换行
- atitit.添加win 系统服务 bat批处理程序服务的法总结instsrv srvany java linux
- Windows校验文件哈希hash的两种常用方式
- 【Gym 100015A】Another Rock-Paper-Scissors Problem
- 牛逼的 弹出层 layer !!!
- floodlight 学习(一)
- 重操JS旧业第五弹:函数
- 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试
- Java之枚举----小试牛刀练习
- MySql 使用规范推荐(转)
- Hbase 读写 原理
- 如何给EOS账户设置自定义权限
- LOJ121 「离线可过」动态图连通性
- VMWare VSphere6.0的实验笔记
- tee命令详解
- 基于C#的机器学习--模糊逻辑-穿越障碍
- Eclipse Java EE IDE中jsp页面编码修改
热门文章
- c#对联合体的封装
- [Oracle][Corruption]发生ORA00600[kdsgrp1]的时候,如何进行调查
- React Native 教程:001 - 如何运行官方控件示例 App
- cocoapod Podfile use frameworks swift/oc混编 could not build module xxx
- 002-打开文件管理规范-20190406.bat
- left join 右表数据不唯一的情况解决方法
- linux alias 别名设置【转载】
- python语言几个常见函数的使用
- Python学习笔记 --第二章
- idea使用优化