题解:P12048 [USTCPC 2025] 多边形转动

· · 题解

考虑将被绕的正多边形展开成一系列长 b 的线段,用长为 a 的线段去覆盖它们,那么显然总长度为 \mathrm{lcm}(a,bn),需要 \frac{\mathrm{lcm}(a,bn)}{a} 条线段,从而也至少需要这些次。多余的次数源于长 b 的线段的端点对长 a 的线段的分割,每有一个端点落在线段上,就需要多一次。这些线段每经过 \mathrm{lcm}(a,b) 的长度,端点就会重合一次,在两次重合期间,共有 \frac{\mathrm{lcm}(a,b)}{b}-1 个端点落到了线段上。共有 \frac{\mathrm{lcm}(a,bn)}{\mathrm{lcm}(a,b)}\mathrm{lcm}(a,b) 的长度,再将二者相乘后与前面保底的次数相加,即得最终答案 \frac{\mathrm{lcm}(a,bn)}{a}+(\frac{\mathrm{lcm}(a,b)}{b}-1)\frac{\mathrm{lcm}(a,bn)}{\mathrm{lcm}(a,b)}。由 ab=\gcd(a,b)\mathrm{lcm}(a,b) 可整理得 \frac{[a+b-\gcd(a,b)]n}{\gcd(a,bn)}

上代码:

#include<bits/stdc++.h>
using namespace std;
long long a,m,b,n;
int main()
{
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>a>>m>>b>>n;
    cout<<(a+b-__gcd(a,b))*n/__gcd(a,b*n);
    return 0;
}