Luogu P3166数三角形

题目
其实就是组合数啊
先把所有情况求出来,再减掉三点共线的情况,剩下的就是能构成三角形的情况
三点共线分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\n",ans);
	return 0;
}
posted @ 2021-03-10 22:26  DReamLion  阅读(42)  评论(0编辑  收藏  举报