题意1.1:

求\(\sum_{i=1}^n Fib^m\mod 1e9+9\),\(n\in[1, 1e9], m\in[1, 1e4]\)

思路1.1

我们首先需要知道斐波那契数列的通项是:\(Fib_i = \frac{\sqrt5}{5}[(\frac{1+\sqrt5}{2})^i-(\frac{1-\sqrt5}{2})^i]\),因为取模是个质数,我们可以用二次剩余定理得到\(\sqrt5 \mod 1e9+9 = 383008016\),然后就可以得到\(\frac{\sqrt5}{5}, \frac{1+\sqrt5}{2},\frac{1-\sqrt5}{2}\)的取模的整数值,我们记为\(s =\frac{\sqrt5}{5}, r_1=\ \frac{1+\sqrt5}{2},r_2= \frac{1-\sqrt5}{2}\)。那么

\[\sum_{i=1}^nFib_i^m = \sum_{i=1}^ns^m(r_1^i - r_2^i)^m = s^m\sum_{i=1}^n\sum_{r=0}^m[(-1)^rC_m^rr_1^{i(m-r)}r_2^{ir}]
\]

因为\(n\)太大了,所以我们还要继续化简:

\[ s^m\sum_{i=1}^n\sum_{r=0}^m[(-1)^rC_m^rr_1^{i(m-r)}r_2^{ir}] = s^m\sum_{r=0}^m[(-1)^rC_m^r\sum_{i=1}^n(r_1^{i(m-r)}r_2^{ir})]
\]

因为\(\sum_{i=1}^n(r_1^{i(m-r)}r_2^{ir})\)是个等比数列,故我们假设\(q_r = r_1^{m-r}r_2^{r}\),则由等比数列性质可得:

\[s^m\sum_{r=0}^m[(-1)^rC_m^r\sum_{i=1}^n(r_1^{i(m-r)}r_2^{ir})]= s^m\sum_{r=0}^m[(-1)^rC_m(q_r\frac{1-q_r^n}{1-q_r})]
\]

推到这里就结束了,直接求解。

题意1.2

牛客传送门

求\(\sum_{i=1}^n Fib^m\mod 1e9\),\(n\in[1, 1e9], m\in[1, 1e4]\)

思路1.2

因为取模是个合数,那就不能二次剩余定理了。斐波那契数列的取模是有循环节的,斐波那契数列幂次的取模循环节和原数列取模循环节相同,那么我们直接暴力找到循环节,然后求解,最后用中国剩余定理合在一起即可。

代码:

//zoj3774
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<cmath>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 100000 + 5;
const int INF = 0x3f3f3f3f;
const ull seed = 131;
const ll MOD = 1000000009;
using namespace std;
ll fac[maxn], inv[maxn];
ll ppow(ll a, ll b){
ll ret = 1;
while(b){
if(b & 1) ret = ret * a % MOD;
b >>= 1;
a = a * a % MOD;
}
return ret;
}
ll C(int n, int m){
return fac[n] * inv[m] % MOD * inv[n - m] % MOD;
}
void init(int n){
fac[0] = inv[0] = 1;
for(int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % MOD;
inv[n] = ppow(fac[n], MOD - 2);
for(int i = n - 1; i >= 1; i--) inv[i] = (i + 1LL) * inv[i + 1] % MOD;
}
int main(){
init(100000);
ll n, m;
ll s = 276601605, r1 = 691504013, r2 = 308495997;
// printf("%lld\n", s * (r1 - r2) % MOD);
int T;
scanf("%d", &T);
while(T--){
scanf("%lld%lld", &n, &m);
ll ans = 0;
for(int r = 0; r <= m; r++){
ll q = 1LL * ppow(r1, m - r) * ppow(r2, r) % MOD;
ll sum = 1LL * q * ((ppow(q, n) - 1LL)) % MOD * ppow(q - 1, MOD - 2) % MOD;
if(q == 1) sum = n % MOD; //!!!!!
sum = 1LL * sum * C(m, r) % MOD;
if(r & 1) sum = -sum;
ans = (ans + sum) % MOD;
}
ans = (ans % MOD + MOD) % MOD;
ans = 1LL * ans * ppow(s, m) % MOD;
printf("%lld\n", ans);
}
return 0;
}
//牛客
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<cmath>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 100000 + 5;
const int INF = 0x3f3f3f3f;
const ull seed = 131;
const ll MOD = 1e9;
using namespace std;
ll mod[2] = {512, 1953125}, a[2];
ll sum[7812500 + 5], fab[7812500 + 5];
int lp[2] = {768, 7812500}; // 循环节
ll ppow(ll a, ll b, ll p){
ll ret = 1;
while(b){
if(b & 1) ret = ret * a % p;
a = a * a % p;
b >>= 1;
}
return ret;
}
void exgcd(ll a, ll b, ll &x, ll &y){
if(b == 0){
x = 1, y = 0;
return;
}
exgcd(b, a % b, x, y);
ll tp = x;
x = y, y = tp - a / b * y;
}
ll CRT(){
ll ans = 0, lcm = 1, x, y;
for(int i = 0; i < 2; i++) lcm *= mod[i];
for(int i = 0; i < 2; i++){
ll tp = lcm / mod[i];
exgcd(tp, mod[i], x, y);
x = (x % mod[i] + mod[i]) % mod[i];
ans = (ans + tp * x * a[i]) % lcm;
}
return (ans % lcm + lcm) % lcm;
}
int main(){
ll n, m;
scanf("%lld%lld", &n, &m);
fab[0] = 0, fab[1] = 1, sum[0] = 0, sum[1] = 1;
for(int i = 2; i <= lp[1]; i++){
fab[i] = (fab[i - 1] + fab[i - 2]) % MOD;
sum[i] = (sum[i - 1] + ppow(fab[i], m, MOD)) % MOD;
}
a[0] = (sum[lp[0]] * (n / lp[0]) + sum[n % lp[0]]) % mod[0];
a[1] = (sum[lp[1]] * (n / lp[1]) + sum[n % lp[1]]) % mod[1];
printf("%lld\n", CRT());
return 0;
}

牛客多校第九场 && ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解的更多相关文章

  1. 牛客多校第九场 A The power of Fibonacci 杜教bm解线性递推

    题意:计算斐波那契数列前n项和的m次方模1e9 题解: $F[i] – F[i-1] – F[i-2] = 0$ $F[i]^2 – 2 F[i-1]^2 – 2 F[i-2]^2 + F[i-3] ...

  2. Cutting Bamboos(2019年牛客多校第九场H题+二分+主席树)

    题目链接 传送门 题意 有\(n\)棵竹子,然后有\(q\)次操作,每次操作给你\(l,r,x,y\),表示对\([l,r]\)区间的竹子砍\(y\)次,每次砍伐的长度和相等(自己定砍伐的高度\(le ...

  3. 2018牛客多校第九场E(动态规划,思维,取模)

    #include<bits/stdc++.h>using namespace std;const long long mod=1000000007,inv=570000004;long l ...

  4. 2019牛客多校第九场AThe power of Fibonacci——扩展BM

    题意 求斐波那契数列m次方的前n项和,模数为 $1e9$. 分析 线性递推乘线性递推仍是线性递推,所以上BM. 由于模数非质数,上扩展版的BM. 递推多少项呢?本地输入发现最大为与前57项有关(而且好 ...

  5. 牛客多校第九场 J Symmetrical Painting 计算几何/扫描线

    题意: 平面上有几个宽度相同的矩形区域被涂黑了,让你找到一条横线横截若干个矩形,把这些黑色部分抠下来一部分使得它们以这条横线为对称轴,求能抠下来的最大面积. 题解: 在随着对称轴上移的过程中,必然有一 ...

  6. 牛客多校第九场 E All men are brothers 并查集/组合论

    题意: 一开始有n人互不认识,每回合有两个人认识,认识具有传递性,也就是相互认识的人组成小团体.现在问你每个回合,挑选四个人,这四个人互不认识,有多少种挑选方法. 题解: 认识不认识用并查集维护即可, ...

  7. 牛客多校第九场 D Knapsack Cryptosystem 背包

    题意: 给你32个物品,给定一个容积,让你恰好把这个背包装满,求出装满的方案 题解: 暴力计算的话,复杂度$2^{32}$肯定会炸,考虑一种类似bsgs的算法,先用$2^{16}$的时间遍历前一半物品 ...

  8. 牛客多校第九场 B Quadratic equation 模平方根

    题意: 已知 $x+y$ $mod$ $q = b$ $x*y$ $mod$ $q = c$ 已知b和c,求x和y 题解: 容易想到$b^2-4c=x^2-2xy+y^2=(x-y)^2$ 那么开个根 ...

  9. 2019牛客多校第九场B Quadratic equation(二次剩余定理)题解

    题意: 传送门 已知\(0 <= x <= y < p, p = 1e9 + 7\)且有 \((x+y) = b\mod p\) \((x\times y)=c\mod p\) 求解 ...

随机推荐

  1. JavaScript中的深拷贝和浅拷贝!【有错误】还未修改!请逛其他园子!

    JavaScript中的深拷贝和浅拷贝! 浅拷贝 1.浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用.{也就是拷贝的是地址!简而言之就是在新的对象中修改深层次的值也会影响原来的对象!} // 2.深 ...

  2. 电脑微信电脑PC 多开/防撤回 补丁

    简介 经常使用微信电脑版的用户都会发现一个蛋疼的事情,那就是微信PC版不支持多开,也就是不能同时登陆多个账号,这对于需要在电脑上登陆多个微信账号的朋友来说肯定是极其的不方便.另外有的时候别人撤回了一些 ...

  3. 现有以下关系型数据库中的表(见表4-20表4-21和表4-22),要求将具转换为适合Hbase存储的表并插入数据。

    ① createTable(String tableName, String[] fields) 创建表,参数tableName为表的名称,字符串数组fields为存储记录各个域名称的数组.要 求当H ...

  4. makefile自动生成学习

    https://www.cnblogs.com/jrglinux/p/6964169.html 关键是如何写Makefile.am  其他的交给 自动工具完成 添加一个 很好的博客 学习下 https ...

  5. pthon之变量

    1.变量由三部分组成: 变量名  =   值 如:name = 'xiaohan'     sex='男'   age = 20 2.变量名的规范 2.1 变量名只能是字母,数字或下划线的任意组合 2 ...

  6. libuv事件循环中的三种句柄

    1.说明 本文会简单介绍 libuv 的事件循环,旨在入门级别的使用,而不做深入探究,简单来说就是,会大概用就行,先用熟练了,再去探究原理和源码 下图为官网的 libuv 的不同部分及其涉及的子系统的 ...

  7. Language Guide (proto3) | proto3 语言指南(五)使用其他消息类型

    Using Other Message Types - 使用其他消息类型 可以将其他消息类型用作字段类型.例如,假设您希望在每个SearchResponse消息中包含Result消息--为此,您可以在 ...

  8. Web漏洞扫描-AWVS

    Web漏洞扫描-AWVS 一.AWVS概述 二.功能以及特点 三.AWVS界面 四.AWVS使用 相关优质博文: CSDN:帽子不够白:WEB渗透测试之三大漏扫神器 一.AWVS概述 Acunetix ...

  9. Java——I/O,字节流与字符流,BufferedOutputStream,InputStream等(附相关练习代码)

    I/O: I/O是什么? 在程序中,所有的数据都是以流的形式进行传输或者保存. 程序需要数据的时候,就要使用输入流读取数据. 程序需要保存数据的时候,就要使用输出流来完成. 程序的输入以及输出都是以流 ...

  10. Mysql,Oracle与Java字段类型映射关系

    Mysql,Oracle与Java字段类型映射关系 参考相关博文 MySQL/Oracle字段类型 Java字段类型 最大长度 BIT java.lang.Boolean 1 BLOB java.la ...