卡片【数学】

>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,BN),设为 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值