POJ 1064 青蛙的约会(拓展欧几里德算法)
来源:互联网 发布:超基因优化液txt下载 编辑:程序博客网 时间:2024/06/06 09:38
一.拓展欧几里德算法
int exgcd(int a,int b,int &x,int &y){ if(b==0) { x=1,y=0; return a; } int q=exgcd(b,a%b,y,x); y-=a/b*x; return q;}
二.例题
Description
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;ll ex_gcd(ll a,ll b,ll &x,ll &y){ ll r,t; if(!b){ x=1; y=0; return a;} r=ex_gcd(b,a%b,x,y); t=x; x=y; y=t-a/b*y; return r;}int main(){ ll x,y,n,m,l,r; while(scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)!=EOF) { ll xx=0,yy=0; ll d=ex_gcd(n-m,l,xx,yy); if((x-y)%d!=0) printf("Impossible\n"); else { xx=xx*((x-y)/d); r=l/d; xx=(xx%r+r)%r; cout<<xx<<endl; } } return 0;}
题解:
列出方程,很容易就会发现用拓展欧几里德算法可以求解,但是有些部分一开始不太容易理解:
1.为什么(x-y)%d的时候无解,这个很容易理解啊,因为题目中求解的t是整数啊!!!!因为最后t=ty*(x-y)/d,ty解出来是整数,若保证(x-y)/d也是整数则t就是整数
2.为什么xx=xx*((x-y)/d);
r=l/d;
xx=(xx%r+r)%r;
首先,解出来的ty可能是负数,所以我们要加上k*b/g,可以用(xx%r+r)%r简单的完成,因为xx%r会将xx控制在(-r,r)范围内,然后通过加上r在%r就完成了。
3.为什么不是一开始的xx加上b/g呢,其实通过推到发现因为如果在最开始加上的话最后会变成(x-y)/d *b/g,因为(x-y)/d 为整数,所以是可以的,那如果无法保证(x-y)/d
为整数,那么是不是就不能这么加了呢?
Problem A
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 19 Accepted Submission(s) : 17
Problem Description要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1)。Input数据的第一行是一个T,表示有T组数据。 每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9)。Output对应每组数据输出(A/B)%9973。Sample Input21000 5387 123456789Sample Output7922//
// main.cpp
// HDU 1576
//
// Created by 张嘉韬 on 16/7/18.
// Copyright © 2016年 张嘉韬. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long exGcd(long long a, long long b, long long &x, long long &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
long long r = exGcd(b, a % b, x, y);
long long t = x;
x = y;
y = t - a / b * y;
return r;
}
int main(int argc, const char * argv[]) {
freopen("/Users/zhangjiatao/Documents/暑期训练/input.txt","r",stdin);
int T;
cin>>T;
for(int t=1;t<=T;t++)
{
int n;
long long B;
cin>>n>>B;
long long x,y,k;
exGcd(B,9973,x,y);
k=n*x;
cout<<(k%9973+9973)%9973<<endl;
}
return 0;
}
和上题一样,同理求解
- POJ 1064 青蛙的约会(拓展欧几里德算法)
- POJ 1061 青蛙的约会 拓展欧几里德
- poj 1061 青蛙的约会(拓展欧几里德)
- POJ 1061 青蛙的约会 (拓展欧几里得算法)
- PKU 1061 青蛙的约会(经典拓展欧几里德)
- BZOJ-1477 青蛙的约会 拓展欧几里德
- POJ1061 青蛙的约会(拓展欧几里德)
- poj 1061 青蛙的约会 -扩展欧几里德算法
- POJ-1061 青蛙的约会(扩展欧几里德算法)
- 扩展欧几里德算法模版题 POJ 1061青蛙的约会
- POJ 1061青蛙的约会 --扩展欧几里德算法
- POJ 1061青蛙的约会【扩展欧几里德算法】
- poj C Looooops 类似青蛙的约会,拓展欧几里得算法
- 拓展欧几里得算法 poj 1061 青蛙的约会
- poj - 1061 - 青蛙的约会(扩展欧几里德)
- POJ 1061 青蛙的约会(扩展欧几里德)
- POJ 1061 青蛙的约会(扩展欧几里德)
- poj 1061 青蛙的约会(扩展欧几里德)
- 在iOS中使用字体文件.ttf(icon font,可缩放矢量图)
- oracle存储过程-游标
- 在第二个页面修改第一个页面listView条目的数据
- scala while循环 for 循环
- 【奔跑的菜鸟】Java中的设计模式——单例模式
- POJ 1064 青蛙的约会(拓展欧几里德算法)
- hdu 5724 SG函数+状压(多校)
- Json
- 从程序员到项目经理
- 通过一张简单的图,让你彻底地、永久地搞懂JS的==运算
- Android @IntDef的使用 - 代替枚举
- 单例
- UITextField的简单使用
- RxJava 学习总结