[CQOI2014][BZOJ3505]数三角形

传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3505

Sol:

发现正面求解不好直接搞
反面求解
所有的ans显然是$ C_{N*M}^3 $
排除所有三点共线的情况就行了
横着和竖着的很好求,$C_n^3 $和$ C_m^3 $ 
问题是斜着的
考虑一条斜线(0,0)->(α,β)
$tan θ$=$\frac{α}{β}$
设$a∈[0,α],b∈[0,β]$
$a$关于$b$的表达式就是
$b= \frac{β}{α} *a$
把$α$和$β$的gcd提出去 $a∈[0,α]$
只需要$a|α$
数量就是$gcd(α,β)-1$[减去最后一个点==]
然后就考虑这个斜线有几条就行了qwq

顺便注意long long

Code

#include <bits/stdc++.h>
using namespace std;
int main(){
    long long N,M;
    scanf("%lld%lld",&N,&M);
    N++,M++;
    long long ans=N*M*(N*M-1)*(N*M-2)/6;
    long long ans1=N*(N-1)*(N-2)/6*M;
    ans=ans-ans1;
    long long ans2=M*(M-1)*(M-2)/6*N;
    ans=ans-ans2;
    for (int i=1;i<N;i++)
        for (int j=1;j<M;j++)
            ans-=(N-i)*(M-j)*(__gcd(i,j)-1)*2;
    cout<<ans;
    return 0;
}

 

posted @ 2019-09-11 20:22  si_nian  阅读(149)  评论(0编辑  收藏  举报