[CQOI2014]数三角形

有个结论:(x1,y1)和(x2,y2)连线上的整点的个数为GCD(x1-x2,y1-y2)-1个。
利用全集-补集,O(1)求出来所有情况减去三点共网格线的,再减去共斜线的即可。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long n,m;
long long ans=0;
long long gcd(long long x,long long y) {return y?gcd(y,x%y):x;}
int main() {
  scanf("%lld%lld",&n,&m);
  ans=((n+1)*(m+1)*((n+1)*(m+1)-1)*((n+1)*(m+1)-2)/6-(n+1)*(m+1)*(m-1)*m/6-(n+1)*(m+1)*n*(n-1)/6);
  for(long long i=1;i<=n;i++)
  for(long long j=1;j<=m;j++)
  ans-=2ll*(gcd(i,j)-1)*(n-i+1)*(m-j+1);
  cout<<ans;
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9368901.html