BZOJ3505 [Cqoi2014]数三角形 数学

来源:互联网 发布:编程加工工艺图片 编辑:程序博客网 时间:2024/05/21 15:47

总数是ans=C3nmmC3nnC3m
斜着的可以用gcd枚举 对于一个长i宽j的矩形 计算出他的对角线 有s个整数点 则该对角线的贡献是s-2(对角线上的两个顶点和其之间的一的点) 再计算出总共有多少的这么大的矩形 求和就好啦

#include<bits/stdc++.h>#define bug(x) cout<<(#x)<<" "<<(x)<<endl#define ll long long/*char *TT,*mo,but[(1<<15)+2];#define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/using namespace std;const int N=1e6+5;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}ll n,m,c[N][4],ans;int main(){#ifdef Devil_Gary    freopen("in.txt","r",stdin);#endif    n=read()+1,m=read()+1;    if(n>m) swap(n,m);    c[0][0]=1;    for(int i=1;i<=n*m;i++){        c[i][0]=1;        for(int j=1;j<=3;j++)            c[i][j]=c[i-1][j-1]+c[i-1][j];    }    ans=c[n*m][3]-n*c[m][3]-m*c[n][3];    for(int i=1;i<n;i++)for(int j=1;j<m;j++){        int tmp=__gcd(i,j)+1;        if(tmp>2) ans-=(tmp-2)*2*(n-i)*(m-j);    }    cout<<ans<<endl;}