设为首页 加入收藏

TOP

BZOJ 3505 CQOI2014 数三角形 组合数学
2015-07-20 17:33:05 来源: 作者: 【 】 浏览:2
Tags:BZOJ 3505 CQOI2014 数三角形 组合 数学

题目大意:

给定一个m*n的方格,求上面有多少个格点三角形

m,n<=1000

枚举O(m^3*n^3),铁定超时

我们选择补集法

首先我们任意选择三个不重复的点构成三角形 用组合数算出这一值 然后刨除三点一线的点即可

枚举三点之中在两边的点的横纵坐标之差,中间点的位置数为GCD(x,y)-1,统计答案即可

注意初始计算组合数时可能会爆int

#include
  
   
#include
   
     #include
    
      #include
     
       using namespace std; typedef long long ll; int m,n; ll ans; int GCD(int x,int y) { if(!y)return x; return GCD(y,x%y); } int main() { int i,j; cin>>m>>n; ++m;++n; ans=m*n; ans=ans*(ans-1)*(ans-2)/6; for(i=0;i<=m;i++) for(j=0;j<=n;j++) if(i||j) { int gcd=GCD(i,j); ans-=(long long)(gcd-1)*(m-i)*(n-j)*(i&&j?2:1); } cout<
      
       

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇BZOJ 3505 CQOI 2014 数三角形 数.. 下一篇poj 1631 Bridging signals (LIS..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·JAVA现在的就业环境 (2025-12-26 01:19:24)
·最好的java反编译工 (2025-12-26 01:19:21)
·预测一下2025年Java (2025-12-26 01:19:19)
·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)