题解:P10570 [JRKSJ R8] 网球(未成功)

题目链接

博客食用更佳 : My blog

这道题不是很难提交记录

分析:

\(A\) 每转 \(a\) 圈,\(B\) 就转 \(b\) 圈,不考虑 \(c\) 的前提下,可知每个齿轮转了 \([a,b]\) 个齿,\(A\)\([a,b] \div a\) 个齿,\(B\)\([a,b] \div b\) 个齿,接着扩倍扩到大于 \(c\)

拓展:

\[[a,b] = a\times b \div (a,b) \]

这里要用辗转相除法,不知道戳

code:

#include <bits/stdc++.h>
#define in(t) t = read()
#define out(t) write(t);
using namespace std;
long long gcd(long long x, long long y) //求最大公因数
{
	if(x % y == 0) return y;
	return gcd(y, x % y);
}
inline void write(long long x)//数据太大了,快读快写
{
    if(x < 0)
	{
    	putchar('-');
		x = -x;
	}
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}
inline long long read()
{
    long long f = 1, x = 0;
    char c = getchar();
    while (c < '0' || c > '9')
	{
        if (c == '-') f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48),c = getchar();
    return f * x;
}

int main()
{
	long long t;
	in(t);
	while(t--)
	{
		long long a, b, c, lcm, mina, minb, xa, xb;
		in(a); in(b); in(c);
		lcm = a * b / gcd(max(a, b), min(a, b));//最小公倍数
		mina = lcm / a, minb = lcm / b;//不考虑c,a和b的最小旋转圈数
		xa = c / mina, xb = c / minb;
		if(xa * mina < c) xa++;//注意齿轮不够时再转一圈
		if(xb * minb < c) xb++;
		out(max(xa, xb) * (mina + minb));//为了对应上要取A,B转的圈数的最大值
		puts("");
	} 
	return 0;
}

完结~撒花🌷

posted @ 2024-07-26 09:45  0x3f3f3f3f3f3f  阅读(16)  评论(0编辑  收藏  举报