Solution -「国家集训队」「洛谷 P4451」整数的 lqp 拆分
Link.
求
其中 为 Fibonacci 数列第 项(),答案对 取模。
。
记 为 的 OGF,首先来推导 。根据定义 ,可以发现经过适当位移, 能推出其自身而解出表达式。具体地:
令 的答案为 ,。简单 DP 得出递推式:
显然的卷积关系。令 的 OGF 为 ,则:
提出一些常数:
我们想求 ,即 ,就得把上式最后一项分式结构配凑成等比数列求和的形式。首先暴力因式分解 ,用求根公式求出其两根:
所以 。代入 的表达式:
拆得清清楚楚啦,答案:
代入 :
最后 ,所以可以 ( 是素模数)直接算出来。
/* Clearink */
#include <cstdio>
const int INV4 = 250000002, S2 = 59713600, MOD = 1e9 + 7;
inline int rmod () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) {
x = ( x * 10ll + ( s ^ '0' ) ) % ( MOD - 1 );
}
return x;
}
inline int mul ( const long long a, const int b ) { return a * b % MOD; }
inline int sub ( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline int add ( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline int mpow ( int a, int b ) {
int ret = 1;
for ( ; b; a = mul ( a, a ), b >>= 1 ) ret = mul ( ret, b & 1 ? a : 1 );
return ret;
}
int main () {
int n = rmod ();
printf ( "%d\n", sub ( 0, mul ( mul ( S2, INV4 ),
sub ( mpow ( sub ( 1, S2 ), n ), mpow ( add ( 1, S2 ), n ) ) ) ) );
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现