【2020.10.24 牛客 普及组 模拟赛四】T3 卡片

102 篇文章 1 订阅
16 篇文章 0 订阅

题目描述
A l i c e Alice Alice B o b Bob Bob各带来一个正多边形卡片。
A l i c e Alice Alice的卡片是边长为A的正M边形,Bob的卡片是边长为B的正N边形。
A l i c e Alice Alice B o b Bob Bob将两张卡片摆放在一起,其中两张卡片并不重叠,并且有至少一个公共顶点和一条公共边。
A l i c e Alice Alice喜欢旋转,因此她沿 B o b Bob Bob的卡片顺时针旋转自己的多边形。
旋转的中心点是多边形公共边上一点,且旋转过程中两张卡片不重叠。
A l i c e Alice Alice想知道,在旋转多少次过后, A l i c e Alice Alice的正多边形会回到原位置。


输入描述:
一行,四个整数 A , M , B , N A,M,B,N A,M,B,N,含义如题目描述所述。
输出描述:
一行,一个数Ans,表示Alice旋转的次数。


示例1
输入
2 4 3 4

输出
8

说明
前两次操作如下图所示:
在这里插入图片描述

示例2
输入
3 4 4 4

输出
24

示例3
输入
2020 1024 2021 1025

输出
828200


备注:
对于10%的数据, M = N = 4 M=N=4 M=N=4,且 A ≤ B ≤ 10 ; A≤B≤10; AB10;
对于另外30%的数据, A ≤ B ≤ 1000 A≤B≤1000 AB1000
对于另外30%的数据,B是A的倍数;
对于100%的数据, 1 ≤ A ≤ B ≤ 1 0 6 , 3 ≤ M ≤ 1 0 6 , 3 ≤ N ≤ 1 0 6 1≤A≤B≤10^6,3≤M≤10^6,3≤N≤10^6 1AB1063M1063N106


解题思路
——“数学虐我千百遍,我待数学如初恋”。。。
又是一道数学题,当时推了一个错误的规律,竟然骗到了一个点。。

正解:
首先,为了让正多边形回到原位置,我们要求出 a a a b ∗ m b*m bm的最小公倍数k,表示要走的路程。。
k / a k/a k/a为反转次数。

接着,通过手动模拟数据我们会发现在拐角处旋转时会多翻折一次。。所以我们要求出将会经历多少个拐角,很显然数量为 k / b k/b k/b.
最后,我们发现,有一种情况,在拐角处也只用翻折一次,如下图:
在这里插入图片描述
SO,我们要找出所有这样的情况!!
判断依据:当走到一条路的边缘,步数为a,b的倍数时,就是这种情况。
数量为 k / k/ k/( t ( t( t(a 和 和 b 的 最 小 公 倍 数 ) / b 的最小公倍数)/b )/b)。。。

最终答案为 k / a + k / b − k / ( t / b ) k/a+k/b-k/(t/b) k/a+k/bk/(t/b)

然后就你就可以去AC了!!


代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cmath>
using namespace std;
long long a,n,b,m,t,k,s;
long long gcd(long long a,long long b)
{
	if(b==0)
		return a;
	return gcd(b,a%b);
}
int main(){
	scanf("%lld%lld%lld%lld",&a,&n,&b,&m);
	t=a*b/gcd(a,b)/b;
	k=a*(b*m)/gcd(a,b*m);
	s=k/b;
	printf("%lld",k/a+s-s/t);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值