数论——斐波那契练习题二——斐波那契变式
来源:互联网 发布:android软件开发项目 编辑:程序博客网 时间:2024/06/08 09:33
题面
题目描述
定义一个数列:
其中
输入输出格式
输入格式:
一行一个整数
输出格式:
一行一个数,表示答案模
输入输出样例
输入样例#1: 复制
19260817
输出样例#1: 复制
34166325
输入样例#2: 复制
1000000000
输出样例#2: 复制
773877569
说明
分析
题目大概是长成ax+by=k的形式,由于f[0]=a,f[1]=b,f[i]=f[i-1]+f[i-2] 所以可以看出在f[i]中a和b的系数是斐波那契中的相邻两项。
那么我么可以从斐波那契下手,枚举斐波那契相邻的两项,利用exgcd求出解的个数。此时依旧是对ax+by=k这个式子进行求解,此时的a等于f[i-1],b等于f[i],可以求出最小的正整数x,此时的y为最大值。可以此时的y满足
设此时的x为x0,则满足x=x0+tb,同理满足y=y0+ta,显然t+1就是此时的答案贡献,那么用最大的y除以a向上取整即可(注意之所以要向上取整而不是t+1,是因为避免y=0的情况,还有注意特判x0=0的情况)
code
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod=1e9+7;ll f[100],cnt,k;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 t=x; x=y; y=t-a/b*y;} int main(){ scanf("%lld",&k); f[1]=f[2]=1;cnt=2; for(int i=3;;i++) { f[i]=f[i-1]+f[i-2]; if(f[i]>1e9) break; ++cnt; } ll ans=0; for(int i=2;i<=cnt;++i) { ll a,b,x,y; a=f[i-1];b=f[i]; exgcd(a,b,x,y);x=x*k;y=y*k; x=(x%b+b)%b; if(x==0) x=b; y=(k-a*x)/b; if(y<0) continue; ans=(ans+(y-1)/a+1)%mod; } printf("%lld",ans);}
阅读全文
0 0
- 数论——斐波那契练习题二——斐波那契变式
- 数论——斐波那契练习题一——斐波那契中的gcd
- 数论——斐波那契数列
- 递归算 斐波那契数列——递归练习题
- 练习题 斐波那契数列
- 数论-斐波那契数列
- 10_python_练习题——兔子问题与斐波那契數列
- 【证明】—— 斐波那契
- for循环语句练习题1斐波那契数列
- 斐波那契数列(Fabonacci)兔子练习题
- 斐波那契数列(thinking in java练习题)
- PAT乙级(Basic Level)练习题 >斐波那契凤尾
- PAT乙级(Basic Level)练习题 斐波那契凤尾
- [数论 斐波那契] 51nod1355. 斐波那契的最小公倍数
- hdu 4549 M斐波那契数列 数论 矩阵
- nefu 115 斐波那契的整除(数论)
- NEFU115 斐波那契的整除(数论水题)
- <数论> NEFU 115 斐波那契的整除
- 核方法原理
- Binder通信机制原理解析
- ARM编程寄存器定义
- 被时间遗忘的角落
- 119. Pascal's Triangle II
- 数论——斐波那契练习题二——斐波那契变式
- NLP之Stanford Parser using NLTK
- 贝叶斯(01) 初识贝叶斯
- 蓝桥杯 基础练习 十六进制转八进制
- cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
- ThreadLocal-单例模式下高并发线程安全
- could-not-execute-graphicsmagick-imagemagick-identify-ping-format
- 冈萨雷斯数字图像处理学习7:图像分割 点线和边缘的检测
- window.location.href parent.location.href top.location.href