题目大意:见刘汝佳《算法竞赛入门经典——训练指南》P173

解题思路:

  每一个合法的三角形的三个顶点都不在同一直线上,那么问题其实就是在求所有不全在同一直线上的三点的组合数。

  我们可以利用容斥原理,先求出所有的三个顶点的组合数C[(n+1)*(m+1)][3]。全在同一直线上的三个网格顶点有三种:三点在同一水平线上的,三点在同一竖直线上的,三点在同一斜线上的。前两种不难求,因此不再赘述,这里重点讲解第三种。

  设三点坐标为(x1,y1),(x2,y2),(x3,y3),且x1 < x2 < x3,y1 < y2 < y3,设 x2-x1 = i,x3-x2 = j,当且仅当 i*(y3-y2) = j*(y2-y1)时,三点在同一斜线上。那么我们可以枚举 i 和 j ,求出 g = gcd(i,j),对于每一个(i,j),再从 1 开始枚举 k ,则此时 y3-y2 = k*j/g,y2-y1 = k*i/g(当 y3 - y1 >= m+1时退出循环),这样就可以知道 x3-x1 和 y3-y1 的值了,接下来就只需要求出放得下多少条这样的斜线就可以。

AC代码:

 #include <iostream>
#include <cstdio>
#include <algorithm> using namespace std;
typedef long long ll;
const int maxn=+;
ll C[maxn][];
void init(){
C[][]=;
C[][]=C[][]=;
for(int n=;n<maxn;n++){
C[n][]=;
if(n<=) C[n][n]=;
for(int m=;m<min(,n);m++){
C[n][m]=C[n-][m-]+C[n-][m];
}
}
}
int gcd(int a,int b){
if(b==) return a;
return gcd(b,a%b);
}
int main(){
init();
int n,m;
int kase=;
while(scanf("%d%d",&n,&m)==&&n&&m){
n++,m++;
if(n>m) swap(n,m);
ll ans=C[n*m][];
ans-=C[n][]*m;
ans-=C[m][]*n;
ll t=;
for(int i=;i<n;i++){
for(int j=;i+j<n;j++){
int gd=gcd(i,j);
for(int k=;;k++){
int id=k*j/gd,ij=k*i/gd;
if(id+ij>=m) break;
t+=(n-(i+j))*(m-(k*(i+j)/gd));
}
}
}
ans-=t*;
printf("Case %d: %lld\n",kase++,ans);
}
return ;
}

最新文章

  1. Order Independent Transparency
  2. Windows环境下的NodeJS+NPM+Bower安装配置步骤
  3. html 通用 遮罩弹出层 弹出后 支持跳转页面
  4. 使用Auto Layout中的VFL(Visual format language)--代码实现自动布局【转】
  5. zepto源码--matches--学习笔记
  6. OpenCV中Mat的详解
  7. qq第3方登录的JS实现方式记录
  8. 模糊集合和隶属度函数--AForge.NET框架的使用(一)
  9. 【翻译】探究Ext JS 5和Sencha Touch的布局系统
  10. jquery选中radio或checkbox的正确姿势
  11. index_levedb.go
  12. linear-gradient 纯CSS3项目价格表切换代码
  13. C#函数的默认参数——填坑记
  14. 一起学习MVC(2)Global.asax的学习
  15. [Asp.net]Calendar+JqueryUi实现日程管理——添加日程
  16. python装饰器内获取函数有用信息方法
  17. ExcelHelper office 导出
  18. spring中自动装配bean
  19. oracle表空间,分区表,以及索引的总结
  20. Java线程及Jvm监控工具

热门文章

  1. 2018 ICPC Pacific Northwest Regional Contest I-Inversions 题解
  2. 狄慧201771010104《面向对象程序设计(java)》第十六周学习总结
  3. PPT模板素材
  4. 几个加速Swift开发的小tip
  5. matlab混合编程向导(vc,vb,.net...)
  6. CSDN排名及积分规则
  7. 设置 Linux 支持中文
  8. linux上github的简单使用
  9. 题目分享Q
  10. C. Fountains