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