10682 deathgod想知道的事(数论)

10682 deathgod想知道的事

该题有题解

时间限制:1000MS  内存限制:65535K
提交次数:265 通过次数:14

题型: 编程题   语言: G++;GCC

 

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的个数。

具体看代码

#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;
}

 

posted @ 2016-06-15 23:01  酱油党gsh  阅读(510)  评论(0编辑  收藏  举报