欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

【10.24 牛客普及(四)】 卡片 题解

程序员文章站 2022-03-19 22:33:50
【10.24 牛客普及(四)】 卡片 题解题目AliceAliceAlice和BobBobBob各带来一个正多边形卡片。AliceAliceAlice的卡片是边长为AAA的正MMM边形,BobBobBob的卡片是边长为BBB的正NNN边形。AliceAliceAlice和BobBobBob将两张卡片摆放在一起,其中两张卡片并不重叠,并且有至少一个公共顶点和一条公共边。AliceAliceAlice喜欢旋转,因此她沿BobBobBob的卡片顺时针旋转自己的多边形。旋转的中心点是多边形公共边上一点...

【10.24 牛客普及(四)】 卡片 题解

题目

A l i c e Alice Alice B o b Bob Bob各带来一个正多边形卡片。
A l i c e Alice Alice的卡片是边长为 A A A的正 M M M边形, B o b Bob Bob的卡片是边长为 B B B的正 N N 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 A A, M M M, B B B, N N N,含义如题目描述所述。


输出

一行,一个数 A n s Ans Ans,表示 A l i c e Alice Alice旋转的次数。


样例

input 1
2 4 3 4

output 1
8

explain
前两次操作如下:
【10.24 牛客普及(四)】 卡片  题解
input 2
3 4 4 4

output 2
24

input 3
2020 1024 2021 1025

output 3
828200


数据范围

对于10%的数据, M M M= N N N=4,且 A A A B B B≤10;
对于另外30%的数据, M M M≤1000, N N N≤1000,且 A A A B B B≤1000;
对于另外30%的数据, B B B A A A的倍数;
对于100%的数据,1≤ A A A≤B≤106,3≤ M M M≤106,3≤ N N N≤106


解题思路

先求出使 A A A卡片和 B B B卡片能有一个顶点重合一回
要走多少条边
操作多少次
然后求要走的边数和 B B B卡片的边数的最小公倍数
最小公倍数除以要走的边数
得出一共要走多少回
与操作数相乘
即为结果


代码

#include<iostream>
#include<cstdio>
using namespace std;
long long a,n,b,m,cz,bs=1,x,y;
long long gcd(long long x,long long y)
{ 
	if (x%y==0)
	   return y;
	   else return gcd(y,x%y);
}
long long lcm(long long a,long long b)
{ 
	return a*b/gcd(a,b);
}
int main()
{
	scanf("%lld%lld%lld%lld",&a,&n,&b,&m);
	x=b;
	y=x%a;
	if (y)
	   cz=x/a+1;
	   else cz=x/a;  //第一条边预处理
	while (y)  //还未有顶点重合
	{
		  bs++;  //要走的边数
		  x=b-a+y;  //上一次多走的,这次不用走
		  y=x%a; 
		  if (y)
		     cz+=x/a+2;
		     else cz+=x/a+1;  //转角还要多+1
	} 
	m=lcm(bs,m);  //求要走多少会
	printf("%lld",cz*(m/bs));
	return 0;
}

本文地址:https://blog.csdn.net/qq_45621109/article/details/109271082

相关标签: 牛客 数学