空间 512M  时限2s

【题目描述】

有n个大于1的正整数a1,a2,…,an,我们知道斐波那契数列的递推式是f(i)=f(i-1)+f(i-2),现在我们修改这个递推式变为f(i)=f(i-1)+f(i-2)+r(i-1),其中r(x)为a1,a2,…,an中为x的约数的个数。现在要求f(m) mod 19940417的值。注:初值f(1)=1,f(2)=1

输入格式:

第一行两个数n,m。

接下来一行n个正整数a1,a2,…,an。

输出格式:

输出一行仅一个数,f(m) mod 19940417的值。

样例输入:

3 7

2 2 3

样例输出:

33

数据范围:

30%的数据n<=1000,m<=1000

另外20%的数据 n=0,m<=109

100%的数据n<=100000,m<=109,2<=ai<=109

题解:

  对于100%的数据,我们可以先考虑把fib[i]=fib[i-1]+fib[i-2] 的答案先用矩阵快速幂跑出来。然后依次输入ai,来看每个ai对fib[m]的影响,因为fib(i)=fib(i-1)+fib(i-2)+r(i-1),所以每一个ai,在它k倍(k*ai<=M)的地方的斐波那契值都会产生+1的影响。我们考虑如果对于斐波那契数列的第i项我们对它加一个1并且继续进行后面的递推的话,那么第j项(j>i)的值就是fib[j]+fib[j-i+1]。所以实际上我们可以对于每个ai分别处理,对于ai,它会给最后的答案贡献fib[m mod ai]+fib[ai+(m mod ai)]+…保证[]内的值小于等于m。

  但如果只是一个一个让答案加上fib[k*ai+(m%ai)],还是会超时,肯定要用到矩阵快速幂来优化,假设我们让B为表示fib[m%ai]的矩阵,那么f[k*ai+(m%ai)]可以表示为B*A^k*ai,然后解决的就是SUM = (A + A^2 + A^3 + ... + A^B)%C的问题(讲解)。

 #include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod=;
struct mat {
int a,b,c,d;
}ZR,E,F,Ans;
int n,m;
mat pre[],pw[];
mat operator*(mat X,mat Y) {
mat Z;
Z.a=((LL)X.a*Y.a+(LL)X.b*Y.c)%mod;
Z.b=((LL)X.a*Y.b+(LL)X.b*Y.d)%mod;
Z.c=((LL)X.c*Y.a+(LL)X.d*Y.c)%mod;
Z.d=((LL)X.c*Y.b+(LL)X.d*Y.d)%mod;
return Z;
}
mat operator+(mat X,mat Y) {
mat Z;
Z.a=(X.a+Y.a)%mod;
Z.b=(X.b+Y.b)%mod;
Z.c=(X.c+Y.c)%mod;
Z.d=(X.d+Y.d)%mod;
return Z;
}
mat fpm(mat a,int b) {
mat w=E;
while(b){
if(b&) w=w*a;
a=a*a;
b>>=;
}
return w;
}
mat vsum(int n){
if(n==) return ZR;
if(n==) return E;
int m=,t=;
while(m<=n) m<<=,++t;
m>>=,--t;
return pre[t]+pw[t]*vsum(n-m);
}
void prepare(mat A){//A矩阵是系数矩阵的ai次方
for(int i=;i<=;++i){
if(i==) pw[i]=A;
else pw[i]=pw[i-]*pw[i-];
if(i==) pre[i]=E;//单位矩阵
else pre[i]=pre[i-]*(E+pw[i-]);
}
}
mat solve(int d) {
if(d>=m) return ZR;
int k=(m-)/d;
prepare(fpm(F,d));
return fpm(F,m--k*d)*vsum(k);
}
int main() {
// freopen("fib.in" , "r", stdin);
// freopen("fib.out", "w", stdout);
scanf("%d%d",&n,&m);
if(m<=){
printf("1\n");
return ;
}
E.a=E.d=;
F.a=F.b=F.c=;
Ans=Ans+fpm(F,m-);//先算出纯 fib序列 for(int i=;i<=n;++i){//
int x;
scanf("%d",&x);
Ans=Ans+solve(x);
}
printf("%d\n",Ans.a);
}

bzoj 3657 斐波那契数列(fib.cpp/pas/c/in/out)的更多相关文章

  1. 辗转相除法求最大公约数(gcd)的斐波那契数列(fib)最坏时间复杂度的证明

    下载地址:http://pan.baidu.com/s/1jIt6UlK

  2. Codeforces 446-C DZY Loves Fibonacci Numbers 同余 线段树 斐波那契数列

    C. DZY Loves Fibonacci Numbers time limit per test 4 seconds memory limit per test 256 megabytes inp ...

  3. Android NDK入门实例 计算斐波那契数列一生成jni头文件

    最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...

  4. HDU3977(斐波那契数列模n的循环节长度)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3977 题意:求斐波那契数列模p的循环节长度,注意p最大是2*10^9,但是它的素因子小于10^6. 分析过 ...

  5. [NEUQ-OJ] 1012 SZ斐波拉契数列

    一道水题,让我看清基础我的基础是多么薄弱. 递归,数组清零,数组名/变量名重复层出不穷...路漫漫啊.......... http://ncc.neuq.edu.cn/oj/problem.php?i ...

  6. Java与算法之(3) - 斐波那契数列

    斐波那契数列问题:如果一对兔子每月能生1对小兔子,而每对小兔在它出生后的第三个月里,又能开始生1对小兔子,假定在不发生死亡的情况下,由一对初生的兔子开始,1年后能繁殖出多少对兔子? 首先手工计算来总结 ...

  7. 斐波拉契数列(Fibonacci)--用生成器生成数列

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列&qu ...

  8. 算法之路(三)----查找斐波纳契数列中第 N 个数

    算法题目 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: * 前2个数是 0 和 1 . * 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1 ...

  9. Python3 ——斐波那契数列(经典)

    刚刚学习了 斐波那契数列,整理一下思路,写个博文给未来的学弟学妹参考一下,希望能够帮助到他们 永远爱你们的 ----新宝宝 经历过简单的学习之后,写出一个比较简单的代码,斐波那契数列:具体程序如下: ...

随机推荐

  1. HDFS 常用Shell命令

    HDFS Shell命令 概述 HDFS Shell命令允许使用命令行在HDFS存储中进行文件夹和文件操作. 如文件夹的增删改查.文件的增删改查等. 开始练习hadoop时,打开Linux之后要用 s ...

  2. JavaScript面向对象OOP思想Class系统

    JavaScript的Class模块,纯天然无依赖,只有2k大小,快速高效,让我们优雅的面向对象... | |目录 1源码:jClass.js 2源码:jClass.min.js 3构建一个类 4访问 ...

  3. 升级PHP版本导致zabbix无法访问解决办法

    故障现象:无法打开zabbix首页,提示缺少zabbix.conf配置文件 原因分析:升级yum安装php版本了,升级前卸载了原PHP5.4版本导致 解决办法: 重新安装zabbix yum inst ...

  4. java讲讲几种常见的排序算法

    java讲讲几种常见的排序算法(一) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 以数组array={6,3,20,8,15,1}为例 冒泡排序 思路:从第0个到 ...

  5. Using the FutureRequestExecutionService Based on classic (blocking) I/O handle a great number of concurrent connections is more important than performance in terms of a raw data throughput

    Chapter 7. Advanced topics http://hc.apache.org/httpcomponents-client-ga/tutorial/html/advanced.html ...

  6. Exception in thread "main" java.lang.UnsupportedClassVersionError: * : Unsupported major.minor version 52.0 解决办法

    Exception in thread "main" java.lang.UnsupportedClassVersionError: * : Unsupported major.m ...

  7. &lt;Android 开源库&gt; GreenDAO 使用方法具体解释&lt;译文&gt;

    简单介绍 greenDAO是一个开源的Android ORM,使SQLite数据库的开发再次变得有趣. 它减轻了开发者处理底层的数据库需求,同一时候节省开发时间. SQLite是一个非常不错的关系型数 ...

  8. img 标签注意 默认img标签,有一个1px的边框 img{ border: 0; }

    默认img标签,有一个1px的边框 img{ border: 0; }

  9. iOS版微信6.5.21发布 适配iPhone X

    昨日,iOS版微信迎来v6.5.21正式版发布,本次升级主要适配iPhone X,在聊天中查找聊天内容时,可以查找交易消息.可以给聊天中的消息设置日期提醒.上一个正式版v6.5.16发布于9月13日, ...

  10. vs2010 重新配置帮助文档

    1.VS2010帮助文件不支持重新配置,这个时候打开C:\Program Files\Microsoft Help Viewer\1.0目录,找到“HelpLibManager.exe.config” ...