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));//输出答案
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现