P3986 斐波那契数列——数学(EXGCD)
https://www.luogu.org/problem/P3986
很久很久以前,我好像写过exgcd,但是我已经忘了;
洛谷上搜EXGCD搜不到,要搜(扩展欧几里得)
这道题就是ax+by=k,其中ab为斐波那契数列里面相邻的两项;
a+b=k ;a+2b=k;2a+3b=k,3a+5b=k;
我们求解ax+by=k;
当x最小时,y最大,答案就是y/a向上取整;
因为y=(k-ax)/b;
{设此时的x为x0,则满足x=x0+tb,同理满足y=y0+ta,显然t+1就是此时的答案贡献,
那么用最大的y除以a向上取整即可(注意之所以要向上取整而不是t+1,
是因为避免y=0的情况,还有注意特判x0=0的情况)}(https://www.luogu.org/space/show?uid=24553)
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mo=1e9+;
ll f[],k;
ll x,y;
int cnt; void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=;y=;
return ;
}
exgcd(b,a%b,y,x);
y-=(a/b)*x;
} ll ans;
int main()
{
scanf("%lld",&k);
f[]=;f[]=;cnt=;
for(int i=;i<=;i++)
{
f[i]=f[i-]+f[i-];
if(f[i]>k) break;
++cnt;
}
for(int i=;i<=cnt;i++)
{
ll a=f[i-],b=f[i];
exgcd(a,b,x,y);
x*=k;//y*=k;
x=(x%b+b)%b;
if(x==) x=b;
y=(k-a*x)/b;
if(y<) continue;
ans=(ans+(y-)/a+)%mo;
}
printf("%lld",ans); return ;
}
P3986 斐波那契数列——数学(EXGCD)的更多相关文章
- [Luogu P3986] 斐波那契数列 (逆元)
题面 传送门:https://www.luogu.org/problemnew/show/P3986 Solution 这是一道很有意思的数论题. 首先,我们可以发现直接枚举a和b会T的起飞. 接下来 ...
- P3986 斐波那契数列
题目描述 定义一个数列: f(0)=a,f(1)=b,f(n)=f(n−1)+f(n−2) 其中 a,b均为正整数,n≥2 . 问有多少种 (a,b),使得 k 出现在这个数列里,且不是前两项. 由于 ...
- 【洛谷P1962 斐波那契数列】矩阵快速幂+数学推导
来提供两个正确的做法: 斐波那契数列双倍项的做法(附加证明) 矩阵快速幂 一.双倍项做法 在偶然之中,在百度中翻到了有关于斐波那契数列的词条(传送门),那么我们可以发现一个这个规律$ \frac{F_ ...
- 《BI那点儿事》Microsoft 时序算法——验证神奇的斐波那契数列
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10 ...
- ACM2 斐波那契数列
描述 在数学上,斐波那契数列(Fibonacci Sequence),是以递归的方法来定义: F0 = 0 F1 = 1 Fn = Fn - 1 + Fn - 2 用文字来说,就是斐波那契数列由0和1 ...
- 关于斐波拉契数列(Fibonacci)
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10 ...
- 【每天一题ACM】 斐波那契数列(Fibonacci sequence)的实现
最近因为一些原因需要接触一些ACM的东西,想想写个blog当作笔记吧!同时也给有需要的人一些参考 话不多说,关于斐波那契数列(Fibonacci sequence)不了解的同学可以看看百度百科之类的, ...
- php实现斐波那契数列以及由此引起的联想
斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一 ...
- 九度OJ题目1387斐波那契数列
/*斐波那契数列,又称黄金分割数列,指的是这样一个数列: 0.1.1.2.3.5.8.13.21.…… 在数学上,斐波纳契数列被定义如下: F0=0,F1=1, Fn=F(n-1)+F(n-2)(n& ...
随机推荐
- jQuery控制页面滚动条上下滚动
.向上滚动 $(); .向下滚动 $(); 参数解读:$(this)表示要实现上下滚动的对象,-50表示向上滚动50px , +50表示向下滚动50px ,1000表示滚动速度
- ifconfig介绍
[root@controller01 ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNK ...
- S3C2440 OpenJtag
C:\Users\Administrator\Desktop>oflash.exe leds.bin +--------------------------------------------- ...
- coco creator编辑动画坑之拖图片
如图所示,批量选中多张图片之后,拖到右下角的框中,发现有时候可以有时候不行.这个我觉得是个软件的bug 后来经过测试发现只有在粉红色圈的高度才可以正确放入图片,否则都放不了.
- django_rest framework 接口开发(一)
1 restful 规范(建议) 基于FbV def order(request): if request.method=="GET": return HttpResponse(' ...
- C#-DBHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Android笔记(十五) Android中的基本组件——单选框和复选框
单选框和多选框通常用来在设置用户个人资料时候,选择性别.爱好等,不需要用户直接输入,直接在备选选项中选择,简单方便. 直接看代码: <?xml version="1.0" e ...
- 每日一题-——LeetCode(807)保持城市天际线
题目描述: 在二维数组grid中,grid[i][j]代表位于某处的建筑物的高度. 我们被允许增加任何数量(不同建筑物的数量可能不同)的建筑物的高度. 高度 0 也被认为是建筑物.最后,从新数组的所有 ...
- Windows——Thinkpad 开机显示pwmtr64v.dll找不到指定的模块
解决方法:进入设备管理器,展开系统设备分页,找到Lenovo Power Manager ,右键,更新驱动程序,浏览计算机上的驱动程序, 让我从计算机上的可用驱动程序列表中选取,选择Lenovo Po ...
- javascript数据判断是否有指定元素
jquery方法: $.inArray(dataKey, dataArray) == -1 javascript方法: indexOf() 功能:根据指定的数据,从左向右,查询在数组中出现的位置,如果 ...