[poj1061]青蛙的约会<扩展欧几里得>
题目链接:http://poj.org/problem?id=1061
其实欧几里得我一直都知道,只是扩展欧几里得有点蒙,所以写了一道扩展欧几里得裸题。
欧几里得算法就是辗转相除法,求两个数的最大公约数,算法是,a,b的最大公约数是gcd(b,a%b)然后不断递归下去,直到b=0
转换成c++语言就是
int ex_gcd(int a,int b)
{
if(b==)return a;
return ex_gcd(b,a%b);
}
扩展欧几里得就是假设c=gcd(a,b);则有a*x+b*y=c;
然后我们要做的就是求x,y,我就是这个位置一直有一点晕,但是这种情况其实简单的举个例子就可以得出结论了。
假设a=60,b=45,不难看出gcd(60,45)=15;然后也可以看出x=-2.y=3;
这是一眼可以看出来的,那么递归怎么做,我们先正常的gcd下去
gcd(60,45)--->gcd(45,15)--->gcd(15,0);
这是普通的gcd,然后把x,y带进去我们其实可以想到,当gcd到最后一步即b=0时,一定有x0=1,y0=0,用递归再返回来一层一层求出x,y;那递归的两层之间x,y有什么联系?
gcd(60,45)--->x=-2,y=3;
gcd(45,15)--->x1=1,y1=-2;
然后我们用式子来表示
gcd(a,b)=c=a*x+b*y
gcd(b,a%b)=c=b*x1+a%b*y1
a%b=a-(a/b)*b
a*x+b*y=b*x1+(a-(a/b)*b)*y1=b*x1+a*y1-(a/b)*b*y1=a*y1+b*(x1-(a/b)*y1);
从这里可以分析出来,
x=y1;
y=x1-(a/b*y1)
有了这一个式子我们就不难推出扩展欧几里得算法的代码了
int ex_gcd(int a,int b)
{
if(b==){
x=;y=;return a;
}
int d=ex_gcd(b,a%b);
int x1=;
x=y;
y=x1-(a/b)*y;
return d;
}//x,y是全局变量
然后知道了扩展欧几里得算法,就可以做这一道题了。
这道题基本就是模板,不用多说,用心体会。。。。
上代码Orz
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm> using namespace std; __int64 n,m,x,y,s,t,d,l,k,ans; __int64 ex_gcd(__int64 a,__int64 b)
{
if(b==)
{
x=;y=;return a;
}
__int64 r=ex_gcd(b,a%b);
__int64 tt=x;
x=y;
y=tt-a/b*y;
return r;
} int main()
{
scanf("%d%d%d%d%d",&s,&t,&n,&m,&l);
k=n-m;ans=t-s;
if(k<){
k=m-n;ans=s-t;
}
d=ex_gcd(k,l);
if(ans%d){
printf("Impossible");return ;
}
__int64 T=l/d;//T是周期,即两只青蛙每相对跳一圈的步数
ans=ans/d;//ans是一开始的距离,先看跳到相同位置步数
ans=ans*x;
ans=(ans%T+T)%T;//跳的步数对周期取余,+T再取余是为了避免负数
printf("%I64d",ans);
}
数据有些大,最好开__int64或者long long (我用__int64过的,没有试过long long 不过应该可以过)
[poj1061]青蛙的约会<扩展欧几里得>的更多相关文章
- POJ1061 青蛙的约会 —— 扩展gcd
题目链接:https://vjudge.net/problem/POJ-1061 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- POJ1061青蛙的约会[扩展欧几里得]
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 108911 Accepted: 21866 Descript ...
- poj1061 青蛙的约会 扩展欧几里德的应用
这个题解得改一下,开始接触数论,这道题目一开始是看了别人的思路做的,后来我又继续以这种方法去做题,发现很困难,学长告诉我先看书,把各种词的定义看懂了,再好好学习,我做了几道朴素的欧几里德,尽管是小学生 ...
- POJ1061——青蛙的约会(扩展欧几里德)
青蛙的约会 Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件 ...
- POJ1061青蛙的约会(扩展欧几里德算法)
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 102239 Accepted: 19781 Descript ...
- POJ1061 青蛙的约会(扩展欧几里得)
题目链接:http://poj.org/problem?id=1061 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- 解题报告:poj1061 青蛙的约会 - 扩展欧几里得算法
青蛙的约会 writer:pprp Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 119716 Accepted: 25238 ...
- POJ1061 青蛙的约会 和 LOJ2721 「NOI2018」屠龙勇士
青蛙的约会 Language:Default 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 133470 Accep ...
- POJ-1061青蛙的约会,扩展欧几里德求逆元!
青蛙的约会 以前不止一次看过这个题,但都没有去补..好吧,现在慢慢来做. 友情提示 ...
- 扩展欧几里得原理的应用:POJ1061青蛙的约会
/* POJ 1061: 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 123709 Accepted: 26395 ...
随机推荐
- PHP压缩文件夹 php
$path = PUBLIC_DIR.'/images/'; //待压缩文件夹父目录 $zipPath = PUBLIC_DIR.'/images_zip/'; //压缩文件保存目录 !is_dir( ...
- Java设计模式二
今天谈的是工厂模式,该模式用于封装和对对象的创建,万物皆对象,那么万物又是产品类,如一个水果厂生产三种水果罐头,我们就可以将这三种水果作为产品类,再定义一个接口用来设定对水果罐头的生成方法,在工厂类中 ...
- 前端每日实战:74# 视频演示如何用纯 CSS 创作一台 MacBook Pro
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MXNNyR 可交互视频 此视频是可 ...
- Python读取和写入文件
1 从文件中读取数据 1.1 读取整个文件 创建名为test的txt文本文件,添加内容如下所示: 123456789023456789013456789012 实现代码: with open('tes ...
- 通过itunes把文件放入app的document目录
通过itunes把文件放入app的document目录 反向也是可以的. 仅仅需要添加plist中一项:Application supports iTunes file sharing,value Y ...
- JVM05——JVM类加载机制知多少
我们已经讲过 JVM 相关的很多常见知识点,感兴趣的朋友可以在我的往期文章中查看.接下来将继续为各位带来 JVM 类加载机制.关注我的公众号「Java面典」了解更多 Java 相关知识点. 类生命周期 ...
- scrapy启动
创建项目 在开始爬取之前,您必须创建一个新的Scrapy项目. 进入您打算存储代码的目录中,运行下列命令: scrapy startproject scrapytest 第一种scrapy gensp ...
- python 异步请求
这是循环请求10次页面.总时间大概是10秒左右,如果是普通的循环请求10次页面而不添加异步的话,时间大概在30秒以上,当然这个数据可能有误,因为有网速的问题存在,但大体的效果应该是不变的. impor ...
- SpringBoot2整合Shiro报错 UnavailableSecurityManagerException: No SecurityManager accessible to the calling code 【已解决】
SpringBoot集成Shiro报错 UnavailableSecurityManagerException: No SecurityManager accessible to the callin ...
- Linux内核文档:如何写符合 kernel-doc 规范的注释
简介 Linux内核使用 Sphinx 实现把 Documentation 目录下的 reStructuredText 文件转换为非常漂亮的文档.文档既可以通过 make htmldocs 转换成 H ...