P1447题解

题目链接

这道题是一道诡异的容斥题。首先我们要确定一个性质,也就是一个点对的gcd就是它的那条线上有几个点。例如点(4,2)到点(0,0)这条线上有2个点。

因此答案其实就是:

但是这样复杂度是不对的。我们可以考虑开一个数组存gcd为i的数对有几个,然后*2-1即可。我们如果不考虑重复的结果就是,但是如果有i的倍数就会有重复,因此我们要像埃氏筛一样把倍数全部给减掉。

最后公式就会变成:

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,m,dp[N],ans;
signed main(){
	cin>>n>>m;
	for(int i=max(n,m);i>=1;i--){
		dp[i]=(n/i)*(m/i);
		for(int j=i*2;j<=max(n,m);j+=i) dp[i]-=dp[j];
		ans+=(i*2-1)*dp[i];
	}cout<<ans;
	return 0;
}
相关推荐
郝学胜-神的一滴6 分钟前
Linux中的alarm函数详解:定时器信号处理指南
linux·服务器·开发语言·c++·程序人生
机器学习之心9 分钟前
MATLAB基于改进蜣螂优化算法的磨削参数低碳优化
算法·matlab·基于改进蜣螂优化算法·磨削参数低碳优化
郝学胜-神的一滴12 分钟前
Linux kill命令与kill函数:从信号原理到实战解析
linux·服务器·开发语言·c++·程序人生
IT_Octopus16 分钟前
算法题:力扣 热题100道 中等难度128. 最长连续序列
算法·leetcode
起个名字费劲死了16 分钟前
基于Mingw64 tesseract 实现英文字符和数字识别
c++·qt·字符识别
浅川.2518 分钟前
xtuoj 方程
算法
Swift社区20 分钟前
LeetCode 441 - 排列硬币
算法·leetcode·职场和发展
曼巴UE521 分钟前
UE5 C++ 动态单播放
c++·ue5
TL滕23 分钟前
从0开始学算法——第七天(快速排序算法练习)
笔记·学习·算法·排序算法
MicroTech202525 分钟前
MLGO微算法科技 D-S融合算法技术发布,助力脑机接口迈向实用化
大数据·科技·算法