Live2D

Solution -「国家集训队」「洛谷 P4451」整数的 lqp 拆分

Description

  Link.

  求

m>0a1..m>0a1++am=ni=1mfai

  其中 fi 为 Fibonacci 数列第 i 项(f0=0,f1=1),答案对 109+7 取模。

  n10104

Solution

  记 F(x){f} 的 OGF,首先来推导 F(x)。根据定义 fn+2=fn+1+fn,可以发现经过适当位移,F(x) 能推出其自身而解出表达式。具体地:

           xF(x)+F(x)=1xF(x)1    (x+11x)F(x)=1    F(x)=x1xx2

  令 n 的答案为 gng0=1。简单 DP 得出递推式:

gn=i=1nfigni

  显然的卷积关系。令 {g} 的 OGF 为 G(x),则:

G(x)=1+G(x)F(x)=11F(x)=1xx212xx2

  提出一些常数:

    G(x)=1xx2+2x1

  我们想求 gn,即 [xn]G(x),就得把上式最后一项分式结构配凑成等比数列求和的形式。首先暴力因式分解 x2+2x1,用求根公式求出其两根:

x1,2=2±222=1±2

  所以 x2+2x1=(xx1)(xx2)。代入 G(x) 的表达式:

G(x)=1x(xx1)(xx2)=1xx1x2(1xx11xx2)=1xx1x2(1x2i=0+xix2i1x1i=0+xix1i)=11x1x2i=1+(x2ix1i)xi

  拆得清清楚楚啦,答案:

[xn]G(x)=(x2x1)1(x2nx1n)

  代入 x1,2

[xn]G(x)=24[(12)n(1+2)n]

  最后 259713600940286407(mod109+7),所以可以 O(logp+logn)p 是素模数)直接算出来。

Code

/* 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;
}

posted @   Rainybunny  阅读(74)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示