P4451-[国家集训队]整数的lqp拆分【生成函数,特征方程】
正题
题目链接:https://www.luogu.com.cn/problem/P4451
题目大意
给出\(n\),对于所有满足\(\sum_{i=1}^ma_i=n\)且\(\forall a_i\in N^+\)的序列求
\]
其中\(Fbi_x\)表示第\(x\)个斐波那契数
\(1\leq n\leq 10^{10^4}\)
解题思路
因为刚学特征方程所以推的都会写下来,比较冗长
首先考虑斐波那契的生成函数\(F(x)=\sum_{i=0}^nFbi_ix^i\)
那么有\(F(x)=x^2F(x)+xF(x)+x\),可以解得\(F(x)=\frac{x}{1-x-x^2}\)。
然后答案就是
\]
然后\(\frac{1}{1-2x-x^2}\)是一个特征方程为\(1-2x-x^2\)的递推式,也就是\(a_n=2a_{n-1}+a_{n-2}\)。
然后\(G(x)=\sum_{i=0}^{\infty}a_ix^i\),那么答案就是
\]
所以我们要求的第\(n\)项就是\(a_{n-1}\)
用特征方程化前面那个递推式了,解出\(1-2x-x^2=0\)有\(x_0=\sqrt 2+1,x_1=-\sqrt 2+1\)
然后设\(a_n=c_0x_0^n+c_1x_1^n\)带入\(a_0=1\)和\(a_1=2\)有方程
\]
解出来就是
\]
然后我们就有
\]
然后二次剩余跑出来在模\(10^9+7\)下\(\sqrt 2=59713600\)带进去做就好了。
时间复杂度\(O(\log n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll g2=59713600,P=1e9+7;
char s[11000];ll n;
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
signed main()
{
scanf("%s",s+1);n=strlen(s+1);
ll p=0;
for(ll i=1;i<=n;i++)
p=(p*10+s[i]-'0')%(P-1);
ll inv=(P+1)/4;
ll c1=(2-g2+P)%P*inv%P,c2=(2+g2)*inv%P;
ll t1=c1*power(P-g2+1,p)%P*power(P-g2+1,P-2)%P;
ll t2=c2*power(g2+1,p)%P*power(g2+1,P-2)%P;
printf("%lld\n",(t1+t2)%P);
return 0;
}
P4451-[国家集训队]整数的lqp拆分【生成函数,特征方程】的更多相关文章
- 洛谷P4451 [国家集训队]整数的lqp拆分 [生成函数]
传送门 题意简述:语文不好不会写,自己看吧 思路如此精妙,代码如此简洁,实是锻炼思维水经验之好题 这种题当然是一眼DP啦. 设\(dp_n\)为把\(n\)拆分后的答案.为了方便我们设\(dp_0=1 ...
- BZOJ 2173 luoguo P4451 [国家集训队]整数的lqp拆分
整数的lqp拆分 [问题描述] lqp在为出题而烦恼,他完全没有头绪,好烦啊… 他首先想到了整数拆分.整数拆分是个很有趣的问题.给你一个正整数N,对于N的一个整数拆分就是满足任意m>0,a1 , ...
- 洛谷P4451 [国家集训队]整数的lqp拆分(生成函数)
题面 传送门 题解 我对生成函数一无所知 我们设\(F(x)\)为斐波那契数列的生成函数,\(G(x)\)为答案的生成函数,那么容易得到递推关系 \[g_n=\sum_{i=0}^{n-1}f_ig_ ...
- 洛谷 P4451 [国家集训队]整数的lqp拆分
洛谷 这个题目是黑题,本来想打表的,但是表调不出来(我逊毙了)! 然后随便打了一个递推,凑出了样例, 竟然. 竟然.. 竟然... A了!!!!!!! 直接:\(f[i]=f[i-1]*2+f[i-2 ...
- P4451 [国家集训队]整数的lqp拆分
#include <bits/stdc++.h> using namespace std; typedef long long LL; inline LL read () { LL res ...
- Luogu4451 [国家集训队]整数的lqp拆分
题目链接:洛谷 题目大意:求对于所有$n$的拆分$a_i$,使得$\sum_{i=1}^ma_i=n$,$\prod_{i=1}^mf_{a_i}$之和.其中$f_i$为斐波那契数列的第$i$项. 数 ...
- [国家集训队]整数的lqp拆分
我们的目标是求$\sum\prod_{i=1}^m F_{a_i}$ 设$f(i) = \sum\prod_{j=1}^i F_{a_j}$那么$f(i - 1) = \sum\prod_{j=1}^ ...
- [国家集训队]整数的lqp拆分 数学推导 打表找规律
题解: 考场上靠打表找规律切的题,不过严谨的数学推导才是本题精妙所在:求:$\sum\prod_{i=1}^{m}F_{a{i}}$ 设 $f(i)$ 为 $N=i$ 时的答案,$F_{i}$ 为斐波 ...
- [BZOJ2173]整数的lqp拆分
[题目描述] lqp在为出题而烦恼,他完全没有头绪,好烦啊… 他首先想到了整数拆分.整数拆分是个很有趣的问题.给你一个正整数N,对于N的一个整数拆分就是满足任意m>0,a1 ,a2 ,a3…am ...
随机推荐
- uwp 动画之圆的放大与缩小
xml code --------------------------------------------------- <Page x:Class="MyApp.MainPage&q ...
- SpringBoot获取所有接口的路由
@Autowired WebApplicationContext applicationContext; @RequestMapping(value = "v1/getAllUrl" ...
- C#多线程---Task实现异步
一.场景 使用Task来进行累加操作. 二.例子-Task使用 1 using System; 2 using System.Collections.Generic; 3 using System.L ...
- LeetCoded第2题题解--两数相加
2.两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表 ...
- Commons-Collections(二)之set
MultiSet set我们都知道,它是无序的,并且是不允许出现重复元素的.但有些场景我们不需要顺序,但是我们需要知道指定key出现的个数(比如每样产品ID对应的剩余数量这种统计信息),那么用Mult ...
- 用tinyxml2读写xml文件_C++实现
下载源代码 开源代码github地址: https://github.com/leethomason/tinyxml2 添加工程文件 将源代码目录中 tinyxml2.h 和 tinyxml2.cpp ...
- IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流
因为公司项目需要,我一个连iPhone都没用过的人竟然跑去开发iOS APP.近一段时间一直忙于赶项目,到今天差不多了,所以记录一下当时遇到的各种坑,先从ios 集成 ijkplayer播放器说起! ...
- MyBatis-Plus 代码生成器模板
MyBatis-Plus 代码生成器模板 maven 依赖 <!--Mysql--> <dependency> <groupId>mysql</groupId ...
- client-go实战之四:dynamicClient
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- eBPF 安全项目 Tracee 初探
1. Tracee 介绍 1.1 Tracee 介绍 Tracee 是一个用 于 Linux 的运行时安全和取证工具.它使用 Linux eBPF 技术在运行时跟踪系统和应用程序,并分析收集的事件以检 ...