2019牛客暑期多校训练营(第九场)The power of Fibonacci——循环节&&CRT
2024-10-06 06:41:12
题意
求 $\displaystyle \sum_{i=1}^n F_i^m $,($1 \leq n\leq 10^9,1 \leq m\leq 10^3$),答案对 $10^9$ 取模。
分析
显然,斐波那契数列在模意义下是有循环节的。
模 $10^9$ 本身的循环节为 $150000000$,还是很大,没意义。
设答案为求和的结果为 $ans$,根据中国剩余定理,要求 $ans \% p$,可先求 $ans \% p_1$ 和 $ans \% p_2$(其中 $p_1p_2 = p$,且 $p_1,p_2$ 互素),然后再合并回去。
设斐波那契数列模 $p$ 时的循环节长度为 $loop(p)$,$10^9 = 2^9 \cdot 5^9$,易知 $loop(512)=768$,$loop(1953125)=7812500$。
模数只拆成了两部分,甚至不用上中国剩余定理的模板。
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll p = 1e9;
const ll p1 = , loop1 = , inv_p1 = ;
const ll p2 = , loop2 = , inv_p2 = ;
ll n, m; ll qpow(ll a, ll b, ll p)
{
ll ret = ;
while(b)
{
if(b&) ret = ret * a % p;
a = a * a % p;
b >>= ;
}
return ret;
} ll fi(ll n, ll m, ll loop, ll p)
{
if(n == ) return ;
if(n == ) return ;
ll yu = n % loop;
ll ret = , tmp = ;
if(yu == ) tmp=;
if(yu == ) tmp=;
ll a=, b=, c;
for(int i = ;i <= loop;i++)
{
c = (a+b) % p;
a = b;
b = c;
ret = (ret + qpow(c, m, p)) % p;
if(i == yu) tmp = ret;
}
return (ret * (n / loop) % p + tmp) % p;
} int main()
{
scanf("%lld%lld", &n, &m);
ll ans1 = fi(n, m, loop1, p1);
ll ans2 = fi(n, m, loop2, p2);
ll ans = (ans1 * p2 %p * inv_p2 %p + ans2 * p1 % p * inv_p1 %p) % p;
printf("%lld\n", ans);
}
参考链接:https://blog.csdn.net/ACdreamers/article/details/10983813
最新文章
- Oracle---------sql 中取值两列中值最大的一列
- 微信小程序-WXSS
- 最短路径算法之Dijkstra算法(java实现)
- 【MVC】关于Action返回结果类型的事儿(下)
- C# 窗体间传值方法大汇总
- 从零开始学JAVA(01)-JAVA开发环境安装
- SqlServer2008 之 应用积累
- windows phone 操作 http异步返回结果
- 使用Eclipse提供的Axis1.x生成WSDL文件以及Server和Client代码
- 基于单个 div 的 CSS 画图
- Rx RxJava【Operators】操作符
- win8vs2012创建自带sqlServer数据库出错
- Roguelike元素对游戏设计的影响
- ASP.NET Core 认证与授权[7]:动态授权
- Linq基础+Lambda表达式对数据库的增删改及简单查询
- [工具]K8tools github/K8工具合集/K8网盘
- ORA-12638:Credential retrieval failed(身份证明检索失败)解决方法
- componentsSeparatedByString 的注意事项
- 修改VS2017模板文件,添加文件头部自定义注释
- SAP字段带空格,导致日期转换失败,提示not a vaild month