【题解】洛谷P3166 [CQOI2014] 数三角形(组合+枚举)

洛谷P3166:https://www.luogu.org/problemnew/show/P3166

#include<iostream>
using namespace std;
#define maxn 1010
long long n,m,ans=1;
long long gcd(long long a,long long b)
{
    if(!b) return a;
    else return gcd(b,a%b);
}
long long C(int n,int m)
{
    long long ret=1;
    for(int i=1;i<=m;i++)
    ret=ret*(n-i+1)/i;
    return ret;
}
int main()
{
    cin>>n>>m;
    n+=1;
    m+=1;
    ans=C(n*m,3);
    if(n>=3) ans-=C(n,3)*m;//减去横竖的点 
    if(m>=3) ans-=C(m,3)*n;
    for(long long i=1;i<n;i++)
        for(long long j=1;j<m;j++)
            ans-=(n-i)*(m-j)*(gcd(i,j)-1)*2;//减去斜的点
    cout<<ans;
}
View Code

猜你喜欢

转载自www.cnblogs.com/BrokenString/p/9693856.html