bzoj 3657 斐波那契数列(fib.cpp/pas/c/in/out)
空间 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)的更多相关文章
- 辗转相除法求最大公约数(gcd)的斐波那契数列(fib)最坏时间复杂度的证明
下载地址:http://pan.baidu.com/s/1jIt6UlK
- 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 ...
- Android NDK入门实例 计算斐波那契数列一生成jni头文件
最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...
- HDU3977(斐波那契数列模n的循环节长度)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3977 题意:求斐波那契数列模p的循环节长度,注意p最大是2*10^9,但是它的素因子小于10^6. 分析过 ...
- [NEUQ-OJ] 1012 SZ斐波拉契数列
一道水题,让我看清基础我的基础是多么薄弱. 递归,数组清零,数组名/变量名重复层出不穷...路漫漫啊.......... http://ncc.neuq.edu.cn/oj/problem.php?i ...
- Java与算法之(3) - 斐波那契数列
斐波那契数列问题:如果一对兔子每月能生1对小兔子,而每对小兔在它出生后的第三个月里,又能开始生1对小兔子,假定在不发生死亡的情况下,由一对初生的兔子开始,1年后能繁殖出多少对兔子? 首先手工计算来总结 ...
- 斐波拉契数列(Fibonacci)--用生成器生成数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列&qu ...
- 算法之路(三)----查找斐波纳契数列中第 N 个数
算法题目 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: * 前2个数是 0 和 1 . * 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1 ...
- Python3 ——斐波那契数列(经典)
刚刚学习了 斐波那契数列,整理一下思路,写个博文给未来的学弟学妹参考一下,希望能够帮助到他们 永远爱你们的 ----新宝宝 经历过简单的学习之后,写出一个比较简单的代码,斐波那契数列:具体程序如下: ...
随机推荐
- 160419、CSS3实现32种基本图形
CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出.直接用CSS3画出这些图形,要比贴图性能更好,体验更加,是一种非常好的网页美观方式. 这32种图形分别为圆形,椭圆形,三角形,倒三角形, ...
- 基于注解的形式配置Bean
基于注解的方式配置Bean:也就说我们在每个Bean的类名前面注解一下,Spring会自动帮我们扫描Bean放进IOC容器中 I基于注解的方式配置Bean(没有依赖关系的Bean)有两个步骤: 1组件 ...
- Hibernate中双向的一对多关系
何为双向,双向的意思就是你我之间可以互相通信(customer(1)和order(n)) 也就是说customer可以访问order,order也可以访问customer 二者构成了双向的关系 在Hi ...
- Hibernate的映射组成关系
建立域模型(Java的对象模型)和关系数据模型(数据库表模型)有着不同的出发点: 域模型: 由程序代码组成, 通过细化持久化类的的粒度(就是通过把相同的属性,规划为一个类)可提高代码的可重用性, 简化 ...
- 微信开发 获取用户openId 与路由控制
w实践,满足当前需求. www.w.com www.w.com/w1.php $wxurl='https://open.weixin.qq.com/connect/oauth2/authorize?a ...
- 用linux c求最大公约数
我写了两中函数,一个是辗转相除法一个是更相减损法,主要代码如下: /*辗转相除法*/int gcd(int a, int b) { ) { return b; } else { return gcd( ...
- CentOS7系统基本操作
查看网卡命令 [root@localhost ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state ...
- python web框架 Django的APP以及目录介绍 2
app: migrations 数据修改表结构 admin Django为我们提供的后台管理 apps 配置当前app models ORM,写指定的类 通过命令可以创建数据库结构 tests 单元测 ...
- JS通过身份证号获取生日、年龄、性别
<script> function IdCard(UUserCard,num){ if(num==1){ //获取出生日期 birth=UUserCard.substring(6, 10) ...
- Spring框架第四篇之基于注解的DI注入
一.说明 与@Component注解功能相同,但意义不同的注解还有三个: 1)@Repository:注解在Dao实现类上 2)@Service:注解在Service实现类上 3)@Controlle ...