luogu P3166 [CQOI2014]数三角形
题面传送门
运用集合思想,用总集减去补集得到所求集合。
总共的点个数减去平行于坐标系的三点共线减去斜边三点共线。
斜边三点共线:枚举一个点,算出他与原点中间点的个数,再把这条线分别向上向右平移, 分别减去。
代码实现:
#include<cstdio>
using namespace std;
inline int gcd(int x,int y){
if(!y) return x;
return gcd(y,x%y);
}
int main(){
register int i,j;
register long long n,m,ans,tot,pus,now;
scanf("%lld%lld",&n,&m);
n++;m++;
ans=n*m*(n*m-1)*(n*m-2)/6-m*n*(n-1)*(n-2)/6-n*m*(m-1)*(m-2)/6;
for(i=1;i<n;i++){
for(j=1;j<m;j++){
ans-=2*(gcd(i,j)-1)*(n-i)*(m-j);
}
}
printf("%lld",ans);
return 0;
}