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 ...
随机推荐
- lucene简单使用demo
测试结构目录: 1.索引库.分词器 Configuration.java package com.test.www.web.lucene; import java.io.File; import or ...
- Eclipse schema xml提示
步骤一:确定xsd文件位置 spring-framework-3.2.0.RELEASE\schema\beans 步骤二:复制路径 步骤三:搜索“xml catalog” 步骤四:添加约束提示 ...
- 函数签名与消息转发:NSInvocation与NSMethodSignature
具体可见 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Article ...
- 洛谷P3567 [POI2014]KUR-Couriers 主席树
挺裸的,没啥可讲的. 不带修改的主席树裸题 Code: #include<cstdio> #include<algorithm> using namespace std; co ...
- SASS 使用(vs code)
二.在vs code中编译sass 1.在拓展商店里搜索“easy sass”,并安装,安装成功后点重新加载. 2.接下来进行配置: 在 vs code 菜单栏依次点击“文件 首选项 设置”,打开 s ...
- nginx upstream
nginx转发http和tcp http转发 upstream goforit_201 { server 172.168.10.10:201; } server { listen 201; serve ...
- 【codeforces 95C】Volleyball
[题目链接]:http://codeforces.com/problemset/problem/95/C [题意] 给你n个点,m条边; 每个点有一辆出租车; 可以到达离这个点距离不超过u的点,且在这 ...
- httpd: Could not reliably determine the server's fully qualified domain name
[root@luozhonghua sbin]# service httpd start Starting httpd: httpd: apr_sockaddr_info_get() failed f ...
- Node.js能够做什么?
正如 JavaScript 为client而生.Node.js 为网络而生.Node.js 能做的远不止开发一个网 站那么简单,使用 Node.js,你能够轻松地开发: 具有复杂逻辑的站点: ...
- Cannot find the class file for javax.servlet.ServletContext.
当eclipse中新导入的Java Project的时候.往往会碰到各种各样的问题,以下是个典型的问题: Cannot find the class file for javax.servlet.Se ...