ans=所有的三点排列-共行的-共列的-斜着一条线的
斜着的枚举每个点和原点的gcd,反过来也可以,还能左右,上下挪
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> long long ans,line,row,tot,n,m; int gcd(int x,int y){return y==0?x:gcd(y,x%y);} int main(){ scanf("%lld%lld",&n,&m);n++,m++; tot=n*m; ans=tot*(tot-1)*(tot-2); ans/=6; line=n*(n-1)*(n-2)/6; row=m*(m-1)*(m-2)/6; ans-=m*line; ans-=n*row; for(int i=1;i<n;i++){ for(int j=1;j<m;j++) { int k=gcd(i,j); if(k>1)ans-=2*(k-1)*(n-i)*(m-j); } } printf("%lld ",ans); }