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(扩展欧几里得)的更多相关文章

  1. 青蛙的约会 (ax+by=c求最小整数解)【拓展欧几里得】

                                                  青蛙的约会(点击跳转) 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住 ...

  2. POJ1061 青蛙的约会 —— 扩展gcd

    题目链接:https://vjudge.net/problem/POJ-1061 青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  3. POJ1061 青蛙的约会(扩展欧几里得)

    题目链接:http://poj.org/problem?id=1061 青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  4. POJ1061 青蛙的约会

    Description 两 只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它 们出发之前忘记了一件很重要 ...

  5. [poj1061]青蛙的约会<扩展欧几里得>

    题目链接:http://poj.org/problem?id=1061 其实欧几里得我一直都知道,只是扩展欧几里得有点蒙,所以写了一道扩展欧几里得裸题. 欧几里得算法就是辗转相除法,求两个数的最大公约 ...

  6. pku 1061 青蛙的约会 扩展欧几里得

    青蛙的约会Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 120482 Accepted: 25449Description 两只青 ...

  7. poj 1061 青蛙的约会 (扩展欧几里得模板)

    青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status ...

  8. JZYZOJ1371 青蛙的约会 扩展欧几里得 GTMD数论

    http://172.20.6.3/Problem_Show.asp?id=1371 题意是两个青蛙朝同一个方向跳 http://www.cnblogs.com/jackge/archive/2013 ...

  9. Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)

    一.Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...

随机推荐

  1. oracle客户端免安装配置、64位机器PL/SQL和VS自带的IIS连接问题

    一.oracle客户端免安装配置 1.到oracle官网下载Oracle InstantClient, 把它解压缩到单独目录,例如C:\OracleClient,2. 添加环境变量 ORACLE_HO ...

  2. javascript变量声明前置

    变量声明前置: 所谓的变量声明前置就是在一个作用域块中,所有的变量都被放在块的开始出声明,下面举个例子你就能明白了 var a = 1; function main() { console.log(a ...

  3. jQuery 选择器实例

    语法 描述 $(this) 当前 HTML 元素 $("p") 所有 <p> 元素 $("p.intro") 所有 class="intr ...

  4. Oracle 用户解锁

    ALTER USER hr ACCOUNT UNLOCK ALTER USER hr IDENTIFIED BY welcome

  5. 编写一个读写倾斜测量数据.s3c文件格式的OSG插件osgdb_s3c

    VS新建一个空的DLL工程 ReaderWriterS3C.cpp源文件 #include <osg/Notify> #include <osgDB/FileNameUtils> ...

  6. 《转》python学习(4)对象

    转自http://www.cnblogs.com/BeginMan/p/3160044.html 一.学习目录 1.pyhton对象 2.python类型 3.类型操作符与内建函数 4.类型工厂函数 ...

  7. c++中new/operator new/placement new

    1. new/delete c++中的new(和对应的delete)是对堆内存进行申请和释放,且两个都不能被重载. 2. operator new/operator delete c++中如果想要实现 ...

  8. LeetCode——Implement Stack using Queues

    Description: Implement the following operations of a stack using queues. push(x) -- Push element x o ...

  9. UVa 130 - Roman Roulette

    模拟约瑟夫环  Roman Roulette  The historian Flavius Josephus relates how, in the Romano-Jewish conflict  o ...

  10. 日请求亿级的QQ会员AMS平台PHP7升级实践

    版权声明:本文由PHP7升级项目组原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/74 来源:腾云阁 https://www ...