P1447能量采集
P1447能量采集
- 定义:(i,j)表示处于(i,j)的植物的贡献
我们发现,点(i,j)与(0,0)的连线所过整点的数目为
发现要是想记录每个点的答案并不好算。那么怎么好算呢?
我们来找一找同一直线上的所有点答案的和的关系。先不考虑答案只考虑个数。发现,寻找一个点及其倍数的个数的和更加好算。而且,因为有n和m的限制,那么向下取整的答案一定就是其本身。考虑容斥,我们只需要从大往小更新答案并将答案乘2减1加起来即可。
那么对于一个点及其倍数的答案怎么计算呢?
假设n小于m,那么对于一个小于n的数i,显然它的倍数的个数就是,这样一来我们只需要考虑小于n的所有数的个数就能够统计n*m的所有数的答案了。至于为什么这一块不用考虑,是因为这里不会再有数容斥它们了,直接统计就行。
所以,答案即为
其中
在代码中一个倒序循环即可,时间复杂度线性。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#define int long long
using namespace std;
inline int read(){
int x=0,w=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
const int maxn=1e5+10;
int ans[maxn];
signed main(){
int n=read(),m=read(),Ans=0;
if(n>m)swap(n,m);
for(int i=n;i;i--){
ans[i]=(n/i)*(m/i);
for(int j=2;j<=n/i;j++)ans[i]-=ans[i*j];
Ans+=(ans[i]*(i*2-1));
}
printf("%lld",Ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现