1. 程式人生 > >Lattice Point or Not UVA - 11768(拓展歐幾裏得)

Lattice Point or Not UVA - 11768(拓展歐幾裏得)

區間 import ali git ips fix http comm .com

轉載至:https://www.cnblogs.com/zyb993963526/p/6783532.html

題意:

給定兩個點A(x1,y1)和B(x2,y2),均為0.1的整數倍。統計選段AB穿過多少個整點。

思路:

做了這道題之後對於擴展歐幾裏得有了全面的了解。

根據兩點式公式求出直線 技術分享圖片,那麽ax+by=c 中的a、b、c都可以確定下來了。

接下來首先去計算出一組解(x0,y0),因為根據這一組解,你可以寫出它的任意解技術分享圖片,其中技術分享圖片,K取任何整數。

需要註意的是,這個 a‘ 和 b‘ 是很重要的,比如說 b‘ ,它代表的是x每隔 b‘ ,就會出現一個整點。

所以這道題目的關鍵就是,我們先求出一組解,然後通過它的 b‘ 將x0改變成x,使得x在[x1,x2]區間之內,這樣每 b‘ 個單位就有一個整點了

,即技術分享圖片

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std;

typedef long long LL;
double X1,Y1,X2,Y2;

void gcd(LL a,LL b,LL& d,LL& x,LL& y)
{
    
if(!b) {d=a;x=1;y=0;} else { gcd(b,a%b,d,y,x); y-=x*(a/b);} } LL solve() { LL x1=X1*10, y1=Y1*10, x2=X2*10, y2=Y2*10; if(x1==x2) //平行y軸 { if(x1%10) return 0; //原來的X1為小數,肯定不是整點 if(Y2<Y1) swap(Y1,Y2); return floor(Y2)-ceil(Y1)+1; } if(y1==y2) {
if(y1%10) return 0; if(X2<X1) swap(X1,X2); return floor(X2)-ceil(X1)+1; } LL a=(y2-y1)*10, b=(x1-x2)*10, c=y2*x1-y1*x2; //c相當於擴大了100倍,所以前面還得乘10 LL d,x,y; gcd(a,b,d,x,y); if(c%d) return 0; //擴展歐幾裏得算法無解的判斷 x=x*c/d; y=y*c/d; //獲得一組整數解(x,y) b=abs(b/d); //這裏的b其實就是b‘ if(X1>X2) swap(X1,X2); x1=ceil(X1); x2=floor(X2); if(x1>x2) return 0; x=x+(x1-x)/b*b; //使x進入[x1,x2]的區間內 if(x<x1) x+=b; if(x>x2) return 0; return (x2-x)/b+1; } int main() { //freopen("D:\\input.txt","r",stdin); int T; scanf("%d",&T); while(T--) { scanf("%lf%lf%lf%lf",&X1,&Y1,&X2,&Y2); LL ans = solve(); printf("%lld\n",ans); } return 0; }

思路:

做了這道題之後對於擴展歐幾裏得有了全面的了解。

根據兩點式公式求出直線 技術分享圖片,那麽ax+by=c 中的a、b、c都可以確定下來了。

接下來首先去計算出一組解(x0,y0),因為根據這一組解,你可以寫出它的任意解技術分享圖片,其中技術分享圖片,K取任何整數。

需要註意的是,這個 a‘ 和 b‘ 是很重要的,比如說 b‘ ,它代表的是x每隔 b‘ ,就會出現一個整點。

所以這道題目的關鍵就是,我們先求出一組解,然後通過它的 b‘ 將x0改變成x,使得x在[x1,x2]區間之內,這樣每 b‘ 個單位就有一個整點了,即技術分享圖片

按 Ctrl+C 復制代碼 按 Ctrl+C 復制代碼

分類: 數學—數論 好文要頂 關註我 收藏該文 技術分享圖片 技術分享圖片 技術分享圖片 、蘇州城外的微笑
關註 - 1
粉絲 - 18 +加關註 0 0 ? 上一篇:LA 3720 高速公路(互質判斜率)
? 下一篇:LA 5846 霓虹燈廣告牌(單色三角形問題) posted @ 2017-04-28 22:20 、蘇州城外的微笑 閱讀(125) 評論(0) 編輯 收藏

Lattice Point or Not UVA - 11768(拓展歐幾裏得)