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 ...
随机推荐
- ImageUtils
JavaSE package com.easystructure.utils.system; import java.awt.Color; import java.awt.Font; import j ...
- Ubuntu16.04 Mysql
1.安装mysql root@ubuntu:~# sudo apt-get install mysql-server root@ubuntu:~# apt install mysql-client r ...
- Edge浏览器的几个创意应用
如果你跟我一样也喜欢书法,并且也有surface.那你可以进入我的网页.我给您准备了中国书法纸.信纸.方格子.对联等模板.满足您打发时间,精心抄佛经.诗歌,练书法等.开启Edge浏览器,开启涂鸦模式, ...
- HTML&CSS——网站注册页面
1.表单标签 所有需要提交到服务器端的表单项必须使用<form></form>括起来! form 标签属性: action,整个表单提交的位置(可以是一个页面,也可以是一个后 ...
- 使用Java开发高性能网站需要关注的那些事儿2
近期各家IT媒体举办的业内技术大会让很多网站都在披露自己的技术内幕与同行们分享,大到facebook,百度,小到刚起步的网站.facebook,百度之类的大型网站采用的技术和超凡的处理能力的确给人 ...
- Mysql语法:navicat for mysql 添加注释
在 navicat 中有三种注释的书写方式: 以 # 开头的字符串,可以多个 # 连续以 – 开头的字符串,注意:只能是 – ,而且 – 后面需要加一个半角空格以 /* */ 包围的字符串,类似于 J ...
- SpringBoot学习笔记(1)----环境搭建与Hello World
简介: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配 ...
- 优动漫 PAINT 导航窗口面板
导航窗口面板用于管理画布的视图.本节将介绍如何在其中缩放.旋转.翻转画布. 如何使用导航窗口面板 使用[导航窗口]面板便于把握整个画布,以下将为您详细介绍. 什么是[导航窗口]面板 [导航窗口]面板用 ...
- vector ----- size函数注意事项
vector 的size函数返回vector大小,返回值类型为size_type,Member type size_type is an unsigned integral type,即无符号整数: ...
- 企业微信H5支付返回不到自己指定的结果页面
项目:vue做的H5项目,嵌入到企业微信里 发现的问题:支付完成后的跳转页面 跳转不到自己指定的页面 问题在于:调支付接口时,redirectUrl: document.location.protoc ...