好题鸭。。

不好直接求三角形个数,那就用全集-补集,转化为求三点共线的数量。

具体求法是求出水平共线数量与竖直共线数量和斜线共线数量。

用排列组合的知识可知为水平和竖直的为$C_n^3$​与$C_m^3​$。

求斜线三点共线:显然,对于点$(a,b) (x,y)$连成的线段$(其中a>x,b>y)$,在它们中间有$gcd(a-x,b-y)-1$个整点,因此基本的思路就是枚举两个点,然后第3个点就是$gcd(a-x,b-y)-1$种可能了。我们又发现,这些线段是可以平移和对称(/和\)的,于是并不需要枚举所有的两个点,只用枚举$(0,0)$和$(x,y)$,然后通过平移和对称($*2$)来计算出现的次数。

那么可以发现,这样任意一条线,向上只能平移$(n-i)$,向下$(m - j)$次,

所以出现次数就为$(n - i + 1) * (m - j + 1)$,其中$+1$是因为可以不移动

#include<iostream>
#include<cstdio>
#define ll long long
#define R register ll
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m;
ll ans;
inline int gcd(int a,int b) {return b?gcd(b,a%b):a;}
signed main() {
n=g()+,m=g()+; ans=1ll*n*m;
ans=1ll*ans*(ans-)*(ans-)/-1ll*m*n*(n-)*(n-)/-1ll*n*m*(m-)*(m-)/;
for(R i=;i<n;++i) for(R j=;j<m;++j) ans-=1ll**(gcd(i,j)-)*(n-i)*(m-j);
printf("%lld\n",ans);
}

2019.06.01

最新文章

  1. 【探索】利用 canvas 实现数据压缩
  2. c# Entity DbArithmeticExpression arguments must have a numeric common type
  3. spring装配---处理自动装配的歧义性
  4. 在使用Intelligencia.UrlRewriter过程中 中文乱码问题
  5. NeHe OpenGL教程 第四十六课:全屏反走样
  6. VC++编程中常用的字符串转换函数
  7. angular.element方法汇总以及AngularJS 动态添加元素和删除元素
  8. 【Permutations】cpp
  9. MYSQL 排行类的相关SQL写法,仅供参考
  10. HEX转BIN源码分析(51系列)
  11. 关于DCLP实现的单例模式的一些想法
  12. PHP文件操作整理
  13. SpringMVC之HandlerMapping的使用
  14. 《HelloGitHub月刊》第 02 期
  15. 让ASP.NET Web API支持$format参数的方法
  16. form表单提交时action路劲问题
  17. 将SQL Server账户对应到Windows系统账户
  18. 关闭多个screen
  19. MyBatis框架(6)动态sql
  20. OpenGL入门学习(四)

热门文章

  1. 杂草丛生HTML5网站模板
  2. BZOJ(begin) 1328 [Usaco2003 Open]Jumping Cows:贪心【波峰波谷模型】
  3. 剑指offer24:判断一个二叉树的后序遍历序列是否为二叉搜索树的后序遍历序列
  4. 「P4996」「洛谷11月月赛」 咕咕咕(数论
  5. 数据结构与算法(3)-----&gt;队列和栈
  6. Zigbee协议栈--Z-Stack的使用
  7. 制作HUD
  8. C#防止sql注入
  9. java——static声明方法注意事项
  10. 《Java多线程编程核心技术》读后感(十八)