>Link
牛客1024普及T3
>Description
有一个边长为A的正M边形
P
1
P_1
P1、一个边长为B的正N边形
P
2
P_2
P2。
这两个图形放在一起,不允许重叠,并且有至少一个公共顶点和一条公共边。
P
1
P_1
P1绕着
P
2
P_2
P2的边顺时针旋转,旋转的中心点是多边形公共边上一点。
求在旋转多少次过后,
P
1
P_1
P1回到原位置。
>解题思路
我们发现题目中的M并没有什么用
且
P
1
P_1
P1回到原位置走过的路程为
l
c
m
(
A
,
B
∗
N
)
lcm(A,B*N)
lcm(A,B∗N),设为
k
k
k。B*N是
P
2
P_2
P2的周长
所以我们加上 P 1 P_1 P1旋转的次数 k / a k/a k/a
然后处理 P 1 P_1 P1转过 P 2 P_2 P2的角的情况
①这种不规则地转弯,我们发现次数要加上
k
/
b
k/b
k/b
②这种规则地转弯,我们就不用进行①的多加操作,所以ans去个重,
−
k
/
l
c
m
(
a
,
b
)
-k/lcm(a,b)
−k/lcm(a,b)
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
int a, m, b, n, k;
int gcd (int A, int B)
{
if (!B) return A;
return gcd (B, A % B);
}
int lcm (int A, int B) {return A * B / gcd (A, B);}
signed main()
{
scanf ("%lld%lld%lld%lld", &a, &m, &b, &n);
k = lcm (a, b * n);
printf ("%lld", k / a + k / b - k / lcm (a, b));
return 0;
}