最后那一步就是斜率>0时,感觉y总讲得不是很清楚,我们可以先确定原点为第一个点,再枚举x,y为第二个点。第三个点为线段上的点,此时有(gcd(x,y)-1)个,然后我们再拿着这条直线去移动,这样就(n-x)(m-y)就来了,不重不漏。
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int gcd(int a,int b)
{
if(a%b==0)
{
return b;
}
return gcd(b,a%b);
}
ll C(ll a)
{
return a*(a-1)*(a-2)/6;
}
int main()
{
int n,m;
cin>>n>>m;
n++;m++;
ll sum=C(n*m);
sum=sum-n*C(m)-m*C(n);
ll res=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
res+=(gcd(i,j)-1)*(n-i)*(m-j)*2;
}
}
cout<<sum-res<<endl;
return 0;
}
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~