POJ1061:青蛙的约会+POJ2115C Looooops+UVA10673Play with Floor and Ceil(扩展欧几里得)
http://poj.org/problem?id=1061
第一遍的写法:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
long long x,y,m,n,l,j1,j2;
long long gcd(long long a,long long b)
{
return b==?a:gcd(b,a%b);
}
void extend(long long a,long long b,long long &x1,long long &y1)
{
if(b==)
{
x1=;
y1=;
return ;
}
extend(b,a%b,x1,y1);
long long t=x1;
x1=y1;
y1=t-a/b*y1;
return ;
}
int main()
{
while(scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)!=EOF)
{
long long a=n-m;
long long b=l;
long long c=x-y;
long long temp=gcd(a,b);
if(c%temp!=||n==m)
{
printf("Impossible\n");
continue;
}
a/=temp;
b/=temp;
c/=temp;
extend(a,b,j1,j2);
long long t=-(j1*c)/b;
j1=c*j1+t*b;
if(j1<)
{
if(b>) j1+=b;
}
printf("%lld\n",j1);
}
return ;
}
第二遍:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
long long x,y,m,n,l,j1,j2;
long long gcd(long long a,long long b)
{
return b==?a:gcd(b,a%b);
}
void extend(long long a,long long b,long long &x1,long long &y1)
{
if(b==)
{
x1=;
y1=;
return ;
}
extend(b,a%b,x1,y1);
long long t=x1;
x1=y1;
y1=t-a/b*y1;
return ;
}
int main()
{
while(scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)!=EOF)
{
long long a=n-m;
long long b=l;
long long c=x-y;
long long temp=gcd(a,b);
if(c%temp!=||n==m)
{
printf("Impossible\n");
continue;
}
a/=temp;
b/=temp;
c/=temp;
extend(a,b,j1,j2);
long long t=((j1*c)%b+b)%b;
printf("%lld\n",t);
}
return ;
}
POJ2115:
题意:
对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。
若在有限次内结束,则输出循环次数。
否则输出死循环。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
long long a,b,c,k;
long long x1,x2;
long long gcd(long long a,long long b)
{
return b==?a:gcd(b,a%b);
}
void extend(long long A,long long B,long long &x1,long long &y1)
{
if(B==)
{
x1=;
y1=;
return ;
}
extend(B,A%B,x1,y1);
long long t=x1;
x1=y1;
y1=t-(A/B)*y1;
}
int main()
{
while(scanf("%lld%lld%lld%lld",&a,&b,&c,&k)!=EOF)
{
if(a==&&b==&&c==&&k==) break;
long long A=c;
long long B=pow(,k);
long long C=b-a;
long long temp=gcd(A,B);
if(C%temp)
{
printf("FOREVER\n");
continue;
}
A/=temp;
B/=temp;
C/=temp;
extend(A,B,x1,x2);
long long t=(C*x1%B+B)%B;
printf("%lld\n",t);
}
return ;
}
题目解析:
这两道题目都是简单的扩展欧几里得求二元一次方程最优解,理解了就好做了,浪费了一天多的时间才搞透,脑残的孩子果断得慢慢学。
更通常的是:我们需要求解方程的最小整数解 若我们已经求得x0,y0为方程中x的一组特解,那么 x=x0+b/gcd(a,b)*t,y=y0-a/gcd(a,b)*t(t为任意整数)也为方程的解 且b/gcd(a,b),a/gcd(a,b)分别为x,y的解的最小间距,所以x在0~b/gcd(a,b)区间有且仅有一个解, 同理y在0~a/gcd(a,b)同样有且仅有一个解,这个解即为我们所需求的最小正整数解。
为什么b/gcd(a,b),a/gcd(a,b)分别为x,y的解的最小间距? 解:假设c为x的解的最小间距,此时d为y的解的间距,所以x=x0+c*t,y=y0-d*t(x0,y0为一组特解,t为任意整数) 带入方程得:a*x0+a*c*t+b*y0-b*d*t=n,因为a*x0+b*y0=n,所以a*c*t-b*d*t=0,t不等于0时,a*c=b*d 因为a,b,c,d都为正整数,所以用最小的c,d,使得等式成立,ac,bd就应该等于a,b的最小公倍数a*b/gcd(a,b), 所以c=b/gcd(a,b),d就等于a/gcd(a,b)。
所以,若最后所求解要求x为最小整数,那么x=(x0%(b/gcd(a,b))+b/gcd(a,b))%(b/gcd(a,b))即为x的最小整数解。 x0%(b/gcd(a,b))使解落到区间-b/gcd(a,b)~b/gcd(a,b),再加上b/gcd(a,b)使解在区间0~2*b/gcd(a,b), 再模上b/gcd(a,b),则得到最小整数解(注意b/gcd(a,b)为解的最小距离,重要)
UVA10673Play with Floor and Ceil
题目解析:
超级大水题,模版题。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
long long p,q,x,k;
long long x1,x2;
long long gcd(long long a,long long b)
{
return b==?a:gcd(b,a%b);
}
void extend(long long a,long long b,long long &x1,long long &y1)
{
if(b==)
{
x1=;
y1=;
return ;
}
extend(b,a%b,x1,y1);
long long t=x1;
x1=y1;
y1=t-a/b*y1;
return ;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&x,&k);
long long a=floor((double)x/(double)k);
long long b=ceil((double)x/(double)k);
long long c=x;
long long temp=gcd(a,b);
a/=temp;
b/=temp;
c/=temp;
extend(a,b,x1,x2);
x1=x1*c;
x2*=c;
printf("%lld %lld\n",x1,x2);
}
return ;
}
POJ1061:青蛙的约会+POJ2115C Looooops+UVA10673Play with Floor and Ceil(扩展欧几里得)的更多相关文章
- 青蛙的约会 (ax+by=c求最小整数解)【拓展欧几里得】
青蛙的约会(点击跳转) 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住 ...
- POJ1061 青蛙的约会 —— 扩展gcd
题目链接:https://vjudge.net/problem/POJ-1061 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- POJ1061 青蛙的约会(扩展欧几里得)
题目链接:http://poj.org/problem?id=1061 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- POJ1061 青蛙的约会
Description 两 只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它 们出发之前忘记了一件很重要 ...
- [poj1061]青蛙的约会<扩展欧几里得>
题目链接:http://poj.org/problem?id=1061 其实欧几里得我一直都知道,只是扩展欧几里得有点蒙,所以写了一道扩展欧几里得裸题. 欧几里得算法就是辗转相除法,求两个数的最大公约 ...
- pku 1061 青蛙的约会 扩展欧几里得
青蛙的约会Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 120482 Accepted: 25449Description 两只青 ...
- poj 1061 青蛙的约会 (扩展欧几里得模板)
青蛙的约会 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status ...
- JZYZOJ1371 青蛙的约会 扩展欧几里得 GTMD数论
http://172.20.6.3/Problem_Show.asp?id=1371 题意是两个青蛙朝同一个方向跳 http://www.cnblogs.com/jackge/archive/2013 ...
- Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)
一.Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...
随机推荐
- windows 2008 r2 安装TabsStudio
windows 2008 r2 安装TabsStudio 办法如下: HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer.如果没有这个项,则新建这个项 ...
- 用 webpack 构建 node 后端代码,使其支持 js 新特性并实现热重载
https://zhuanlan.zhihu.com/p/20782320?utm_source=tuicool&utm_medium=referral
- 异常处理----使用 try…catch…finally 处理异常
使用 try…catch…finally 处理异常 异常处理是通过try-catch-finally语句实现的. try { ...... //可能产生异常的代码 } catch( Exception ...
- Python 解压缩Zip和Rar文件到指定目录
#__author__ = 'Joker'# -*- coding:utf-8 -*-import urllibimport osimport os.pathimport zipfilefrom zi ...
- laravel 控制器多个方法共用一个路由
直接上代码: Route::get('Index/{action}', function(App\Http\Controllers\IndexController $index, $action){ ...
- easyui 时间定格为 时分
$.fn.datetimebox.defaults.formatter = function (date) { console.log('dt formatting ' + date); if (!( ...
- thinkjs——redis
前言: 后台某些操作的时候会用到缓存:比如用户登录或者校验次数的情景.而本次遇见的状况就是在点击“推送”按钮的时候,需要判断缓存中是否有其值,并将其次数限制为固定值. 过程: 刚听到此需求的时候,首先 ...
- bootstrap里面的popover组件如何使鼠标移入可以对弹出框进行一系列的操作
在bootstrap里面,有一个组件很可爱,它就是popover,它是对标签title属性的优化,奉上连接一枚:http://docs.demo.mschool.cn/components/popov ...
- MUI 页面跳转(传值+接收)
官方:做web app,一个无法避开的问题就是转场动画:web是基于链接构建的,从一个页面点击链接跳转到另一个页面, 如果通过有刷新的打开方式,用户要面对一个空白的页面等待: 如果通过无刷新的方式,用 ...
- 【Thinkphp5】结合layer弹窗 定制操作结果页面
1 打开应用公共文件页面 appliction/common.php,编写以下代码 注意: 成功消息的绿色背景部分是iframe 框架写法,如果是普通页面.就吧parent去除,改为: self ...