题目
其实就是组合数啊
先把所有情况求出来,再减掉三点共线的情况,剩下的就是能构成三角形的情况
三点共线分3种:1.在同一行 2.在同一列 3.在斜线上
所以一边扫一边减就行了
注意给的是格子的行列数,格点的行列数要+1
其实读入m,n之后直接++,后面就不用注意这个+1的问题了,要不每次都+1就很麻烦,我写的时候真是傻了
贴一个写的很丑的代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define maxn 2010
#define ll long long
using namespace std;
template<typename T>
inline void read(T &x){
x=0; bool flag=0; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
for(;isdigit(c);c=getchar()) x=x*10+(c^48);
if(flag) x=-x;
}
ll m,n,ans;
ll mul(ll a){
ll res;
res=(a)*(a-1)*(a-2)/(1*2*3);
return res;
}
int gcd(int a,int b){
return (b==0)?a:gcd(b,a%b);
}
int main(){
read(m),read(n);
// m++;n++;
ans=mul((m+1)*(n+1));
// cout<<"*"<<ans<<endl;
if(m>=2) ans-=(n+1)*mul(m+1);
if(n>=2) ans-=(m+1)*mul(n+1);
// cout<<"**"<<ans<<endl;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
ans-=2*(m-i+1)*(n-j+1)*(gcd(i,j)-1);
printf("%lld
",ans);
return 0;
}