题目描述
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。注意三角形的三点不能共线。
输入输出格式
输入格式:
输入一行,包含两个空格分隔的正整数m和n。
输出格式:
输出一个正整数,为所求三角形数量。
输入输出样例
说明
1<=m,n<=1000。
推完式子之后就是NOIP题。
补集转化一下就好了
#include<bits/stdc++.h> #define ll long long #define maxn 1005 using namespace std; ll f[maxn][maxn],n,m; ll ans=0,sum[maxn],t=0; inline ll C(ll x){ return x*(x-1)*(x-2)/6; } ll gcd(ll x,ll y){ return y?gcd(y,x%y):x; } int main(){ scanf("%lld%lld",&n,&m); ans=C((n+1)*(m+1))-(n+1)*C(m+1)-(m+1)*C(n+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ sum[j]+=gcd(i,j); f[i][j]=f[i][j-1]+sum[j]; t+=f[i][j]-i*j; } ans-=t<<1; printf("%lld ",ans); return 0; }