CF678C题解
思路
因为 $1\le n \le 10^9$,显然直接模拟是不行的,但是题目中公倍数已经在提示我们这道题的做法了。
由于涂色是带有规律性的(是 $a$ 或 $b$ 的倍数时才涂色),设在 $1\sim n$ 中有 $x$ 块可以涂红的瓷砖,$y$ 块可以涂蓝的瓷砖,$z$ 块又可以涂红又可以涂蓝的的瓷砖,显然有:
$$ x=\lfloor \frac{n}{a}\rfloor,y=\lfloor \frac{n}{b}\rfloor $$
那么 $z$ 呢?
根据基础数论,有:
$$ \text{lcm}(a,b)=\frac{a\times b}{\gcd(a,b)} $$
其中 $\text{lcm}$ 代表最小公倍数。
所以有:
$$ z=\frac{n}{\text{lcm}(a,b)}=\frac{n}{\frac{a\times b}{\gcd(a,b)}} $$
最后,利用贪心思想,对于又可以涂红又可以涂蓝的的瓷砖,涂上获利更多的颜色。
同时,我们还要将 $x,y$ 减去 $z$,避免重复计算。
所以最后答案就为:
$$ (x-z)\times p+(y-z)\times q+z\times \max(p,q) $$
代码
#include<bits/stdc++.h>
using namespace std;
long long ans,n,a,b,p,q,sum[5];//sum[1]代表z,sum[2]代表x,sum[3]代表y
int main() {
scanf("%lld%lld%lld%lld%lld",&n,&a,&b,&p,&q);
sum[1]=n/((a*b)/__gcd(a,b)),sum[2]=(n/a)-sum[1],sum[3]=(n/b)-sum[1];//计算x,y,z,计算式上已给出
printf("%lld",sum[2]*p+sum[3]*q+sum[1]*max(p,q));//输出答案
}

浙公网安备 33010602011771号