【组合】BZOJ3505(Cqoi2014)[数三角形]题解
生活随笔
收集整理的這篇文章主要介紹了
【组合】BZOJ3505(Cqoi2014)[数三角形]题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目概述
求 n×m 網格中的三角形個數。
解題報告
首先肯定是用總方案數 (n3) 減去不合法的方案數要方便很多。但是怎么求不合法(三點共線)的方案數?
有個結論是橫長為 x 縱長為 y 的線段中整點的個數為 gcd(x,y)+1 ,yy一下不難得出。
那么只要枚舉 x,y ,然后算出共線三角形的方案數 gcd(x,y)?1 ,再把這條線段放入網格(共有 (n?x+1)(m?y+1) 種方案)就行了。
示例程序
#include<cstdio> using namespace std; typedef long long LL;int n,m;LL ans;#define C(x) ((LL)(x)*((x)-1)*((x)-2)/6) int gcd(int a,int b) {if (!b) return a;return gcd(b,a%b);} int main() {freopen("program.in","r",stdin);freopen("program.out","w",stdout);scanf("%d%d",&m,&n);n++;m++;ans=C(n*m);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++) if (i>1||j>1){LL now=(LL)(n-i+1)*(m-j+1)*(gcd(i-1,j-1)-1);ans-=now;if (i-1&&j-1) ans-=now;}return printf("%lld\n",ans),0; }總結
以上是生活随笔為你收集整理的【组合】BZOJ3505(Cqoi2014)[数三角形]题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有关“安装程序启动安装引擎失败:不支持此
- 下一篇: 视频去水印前端界面布局