gcd步数
题目描述
一个有趣的函数F(a,b),表示对于数对(a,b)调用辗转相除法的步数为多少
例如 (24,40)....0 (16,24).....1 (8,16).....2 (0,8)....3,即f(24,40)=3
现在已知f(a,b)=k,求(a,b)使得a+b尽量小,同时,由于最终的(a,b)可能比较大,所以你只要在模10^9+7同余系下输出结果即可
输入输出格式
输入格式:
一个数k
输出格式:
两个数a,b
输入输出样例
1000000007
0 1000000006
说明
对于100% 数据 k < 10^15
这个题很有意思,值得一想
我们需要考虑gcd的过程
最差情况是 -> 每次操作都是商1 -> 相当于两个数做差
这个时候就是次数最多,也就是我们要找的最小的a,b的情况
由反复做差 -> 可以联想到斐波那契数列
经过简单的举例,
这个题就是求斐波那契数列的第 k和k+1 项
(上面不太懂的话自己举个例推算一下就很好理解了)
由于数据范围很大,所以需要拿矩阵快速幂来算
代码
#include<cstdio>
#include<iostream>
#include<cstring>
#define MAXN 110
#define mod 1000000007
using namespace std;
long long N,M;
struct Matrix{
long long mat[MAXN][MAXN]; Matrix operator *(const Matrix& a)
{
Matrix c;
memset(c.mat,,sizeof c.mat);
for(int i=;i<=N;i++)
for(int j=;j<=N;j++)
for(int k=;k<=N;k++)
c.mat[i][j]=(c.mat[i][j]+mat[i][k]*a.mat[k][j])%mod;
return c;
}; Matrix operator ^(long long k)
{
Matrix c=*this,t=*this;
k--;
for(;k;k>>=,t=t*t)
if(k&)c=c*t;
return c;
}; void print()
{
for(int i=;i<=N;i++)
{
for(int j=;j<=N;j++)printf("%d ",mat[i][j]);
printf("\n");
}
};
void scan()
{
for(int i=;i<=N;i++)
for(int j=;j<=N;j++)
scanf("%lld",&mat[i][j]);
};
}; int main()
{
scanf("%lld",&M);M++;
if(M==){printf("1 1\n");return ;}
if(M>)M-=;
else {printf("");return ;}
Matrix x;
N=,x.mat[][]=,x.mat[][]=,x.mat[][]=,x.mat[][]=;
Matrix p=x^M;
printf("%lld ",p.mat[][]);
p=x*p;
printf("%lld\n",p.mat[][]);
return ;
}
gcd步数的更多相关文章
- POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)
题目链接 题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数. 分析:以前用状态压缩做过. 和上题差不多,唯一的不同是这个终态是黑棋或者白棋, 但是只需要把给的初态做不同的两次处理就行了. 感觉现 ...
- POJ 1681 Painter's Problem (高斯消元 枚举自由变元求最小的步数)
题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...
- poj 1061 青蛙的约会(扩展gcd)
题目链接 题意:两只青蛙从数轴正方向跑,给出各自所在位置, 和数轴长度,和各自一次跳跃的步数,问最少多少步能相遇. 分析:(x+m*t) - (y+n*t) = p * L;(t是跳的次数,L是a青蛙 ...
- gcd?人生赢家!
题目背景 原创:b2019dy gcd是一个热爱游戏的人 题目描述 gcd最近在玩一个有趣的游戏 我们把这个游戏抽象成一张图,图上有n个点,我们需要寻找总计m件宝物,它们分布在图上,对于每件宝物而言, ...
- ZOJ 3593 One Person Game(拓展欧几里得求最小步数)
One Person Game Time Limit: 2 Seconds Memory Limit: 65536 KB There is an interesting and simple ...
- POJ 3126 Prime Path【从一个素数变为另一个素数的最少步数/BFS】
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26475 Accepted: 14555 Descript ...
- #410div2C. Mike and gcd problem
C. Mike and gcd problem time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- HDU5514——容斥原理&&gcd
题目 链接 有n只青蛙,有m块石头,编号为0-m-1,第i只青蛙每次可以跳$a_i$, 刚开始都在0,问,青蛙总共可以跳到的石头之和为多少.其中$t≤20$,$1≤n≤10^4$,$1≤m≤10^9$ ...
- 2017-2018 ACM-ICPC Latin American Regional Programming Contest J - Jumping frog 题解(gcd)
题目链接 题目大意 一只青蛙在长度为N的字符串上跳跃,"R"可以跳上去,"P"不可以跳上去. 字符串是环形的,N-1和0相连. 青蛙的跳跃距离K的取值范围是[1 ...
随机推荐
- VC6.0 设置动态链接库工程生成dll以及lib文件的位置
在"Projet"->"Settings..."的"Link"选项卡中 "Output file name"中设置 ...
- (转载) Android-Spinner的使用以及两种适配器
目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选 程序员8月书讯 项目管理+代码托管+文档协作,开发更流畅 Android-Spinner的使用以及两种适配器 201 ...
- 51nod 1557 两个集合 (严谨的逻辑题)
题目: 1557 两个集合 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 小X有n个互不相同的整数: p1,p2,...,pn ...
- proxy in java
[Static] IFeature.java ImpicateF.java Runport.java StaticProxy.java IFeature.java package UProxy.sta ...
- 51nod 1110 距离之和最小V3
X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i].点P到点P[i]的带权距离 = 实际距离 * P[i]的权值.求X轴上一点使它到这N个点的带权距离之和最小,输出这个最小的带 ...
- 1028C:Rectangles
You are given n rectangles on a plane with coordinates of their bottom left and upper right points. ...
- linux系统利用GPU跑数据(tensorflow)
https://blog.csdn.net/qq_26591517/article/details/82469680 查看机器上GPU情况 命令: nvidia-smi 功能:显示机器上gpu的情况 ...
- [洛谷P1580]yyy loves Easter_Egg I
题目大意:很多人@一个人,如果那个人忍不住说话了,就轰炸成功,如果那个人没说话或者别的人没有@他或@很多个人,则轰炸失败.(具体见原题) 解题思路:字符串处理,好好用sscanf即可(细节见代码). ...
- 架构思想之CAP原理
由于自己负责后端的设计已经有一段时间,对设计的一些思想和理论有一些理解,但最近被问到什么是CAP时,却一脸懵逼,下来后专门针对CAP架构思想进行了一些专题学习,在这里也将这个概念引入给大家,大家可以有 ...
- pandas 5 导入导出 读取保存 I/O API
官网The pandas I/O API pickle格式是python自带的 from __future__ import print_function import pandas as pd da ...