[Cqoi2014]數三角形[排列組合]
阿新 • • 發佈:2018-11-10
題意:給定一個nxm的網格,請計算三點都在格點上的三角形共有多少個。共線不算.
思路:
- 容斥
- 其中SameLine包括: 斜著共線和垂直水平共線.斜著共線一開始以為只有8個dir錯了幾次.
- 列舉2個點,再考慮這2個點的線段上有幾個整數點,我們就可以解決這個問題
- 然而列舉兩個點的複雜度為O()
- 我們只列舉第二個端點的座標,以(1,1)為第一個端點座標,再平移這條線段,這條線段能存在的次數有(n-i+1)*(m-i+1)*2,乘2是因為左右對稱
- 最終複雜度是O(n*m*log2n)
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e3+3; const int MOD=1e9+7; ll cul(ll x){ if(x<3) return 0; return x*(x-1)/2*(x-2)/3; } int main(void){ int n,m; scanf("%d%d",&n,&m); n++,m++; ll ans=cul(1ll*n*m); ans-=m*cul(n); ans-=n*cul(m); for(int i=2;i<=n;i++){ for(int j=2;j<=m;j++){ ll cnt=__gcd(i-1,j-1)-1; ans-=(n-i+1)*(m-j+1)*cnt*2; } } printf("%lld\n",ans); return 0; }