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

ssl_yty發表於2020-10-25

【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
前兩次操作如下:
在這裡插入圖片描述
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;
}

相關文章