10682 deathgod想知道的事(數論)

10682 deathgod想知道的事

該題有題解ios

時間限制:1000MS  內存限制:65535K
提交次數:265 經過次數:14編程

題型: 編程題   語言: G++;GCCspa

 

Description

    一隻螞蟻從衣服地圖上爬過留下痕跡,deathgod看到後在地圖上建了個座標,將螞蟻留下的痕跡分紅多條線段首位相連而成,
且那些線段的端點都是整數點,如今他想知道這隻螞蟻通過了座標中多少個整數點。




輸入格式

    第一行輸入一個整數t,表示case數;對於每一個case,第一行輸入一個整數n(0<=n<=10),表明螞蟻通過的線段的數量,
接下來n+1行,每行有兩個整數x,y(-10000<=x,y<=10000),表示螞蟻依次通過線段的端點。



輸出格式

每一個case輸出一行,螞蟻所通過的整數點數量。



 

輸入樣例

1
3
0 0
0 4
2 2
2 0



 

輸出樣例

9



題解

計算兩個點以前有多少個整數點,只要算gcd(abs(x1-x2),abs(y1-y2))就好了。
而後利用這個算出這兩個點之間整數點的座標。
而後丟進set裏面,去重。
最後輸出set的個數。code

具體看代碼blog

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <set>

using namespace std;
int gcd(int a ,int b)
{
    return b>0?gcd(b,a%b):a;
}
int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        set <pair<int,int> > S;
        int n;
        scanf("%d",&n);
        int a,b,c,d;
        if (n)
        {
            scanf("%d%d",&a,&b);
            S.insert(make_pair(a,b));
        }
        for (int i=0;i<n;i++)
        {
            scanf("%d%d",&c,&d);
            int GCD=gcd(abs(c-a),abs(d-b));
            int len1=0,len2=0;
            if (GCD)
            len1=(c-a)/GCD,len2=(d-b)/GCD;
            for (int j=1;j<=GCD;j++)
            {
                S.insert(make_pair(a+j*len1,b+j*len2));
                //cout<<"通過的點 :"<<a+j*len1<<" "<<b+j*len2<<endl;
            }
            a=c,b=d;
        }
        printf("%d\n",S.size());
    }
    return 0;
}
相關文章
相關標籤/搜索