[CQOI2014]数三角形

题目描述

给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。注意三角形的三点不能共线。

 

输入输出格式

输入格式:

 

输入一行,包含两个空格分隔的正整数m和n。

 

输出格式:

 

输出一个正整数,为所求三角形数量。

 

输入输出样例

输入样例#1: 
2 2
输出样例#1: 
76

说明

  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\n",ans);
    return 0;
}

 

posted @ 2018-03-09 10:20  蒟蒻JHY  阅读(261)  评论(0编辑  收藏  举报