SPOJ4717——Grid Points in a Triangle
题目的意思很简单。就是要你求出斜率为a/b的一个点在原点,一条边为x=n的RT三角形里面有多少个整数点?
看完题目后依然没有思路,依然去看各个神牛写的题解。后来才反应过来。
题目的正解应该是这样的。递归求解。
假如对于当前dfs(n,a,b)表示我们要求解斜率为a/b,且横坐标不超过n的整点数目。
如果a>b,那么我们可以统计在在内部包含的点数为=a/b个等腰直角三角形所包含的点的数目+dfs(n,a%b,b)。
好好理解上面这个式子,这也算是第一个难点吧。
d=a*n/b;
至此,我们可以保证a<b了,于是我们把三角形补全为平行四边形,这样相当于递归求dfs(d,b,a)了。
但是中间有一些难点细节,比如其实对于整点数目来说,平行四边形按对角线平分为两个直角三角形中的整点数目不一定是相等的,而且还有对角线上面的点重复添加了,所以要考虑减出来,减多了的又要加回去。详见代码:跟神犇的很相似,诶,数论嘛。
#include <cstdio>
#define ll long long
using namespace std; ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
} ll dfs(ll n,ll a,ll b)
{
ll t=n*(n+)/*(a/b);
a%=b;
if (a==) return t+n+;//a==0说明与x轴重合了,点数为n+1。原来还要考虑有多少倍等腰直角三角形的点数。
ll d=a*n/b;
t+=(n+)*(d+)+d/a+;//平行四边形另一半减多了的要加回来。
return t-dfs(d,b,a);//减去四边形中另一半的点数。
} int main()
{
ll a,b,n,t,g;
scanf("%lld",&t);
while (t--)
{
scanf("%lld%lld%lld",&n,&a,&b);
g=gcd(a,b);
printf("%lld\n",dfs(n,a/g,b/g));//如果不除以gcd,答案会出错。
}
return ;
}
SPOJ4717——Grid Points in a Triangle的更多相关文章
- BZOJ2831(小强的金字塔系列问题--区域整点数求法)
题目:2831: 小强的金字塔 题意就是给出A,B,C,R,L,然后求 这里其实用到扩展欧几里德.(基本上参照clj的解题报告才理解的) 分析:我们先来分析一般情况: 这里我们假设A<C和B&l ...
- POJ 1265 Area POJ 2954 Triangle Pick定理
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5227 Accepted: 2342 Description ...
- 论文阅读笔记三十七:Grid R-CNN(CVPR2018)
论文源址:https://arxiv.org/abs/1811.12030 开源代码:未公开 摘要 本文提出了目标检测网络Grid R-CNN,其基于网格定位机制实现准确的目标检测.传统方法主要基于回 ...
- R实战:grid包
grid包是一个底层的绘图系统,能够灵活地控制图形输出的外观和布局,但是grid包不提供创建完整图形的高级绘图系统,例如,ggplot2和lattice,而是提供绘制开发这些高级绘图的基础接口,例如: ...
- HDU 2018 Multi-University Training Contest 1 Triangle Partition 【YY】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6300 Triangle Partition Time Limit: 2000/1000 MS (Java ...
- HDU 多校对抗赛 C Triangle Partition
Triangle Partition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Oth ...
- 2018HDU多校训练一 C -Triangle Partition
Chiaki has 3n3n points p1,p2,-,p3np1,p2,-,p3n. It is guaranteed that no three points are collinear. ...
- Spring-2-B Save the Students(SPOJ AMR11B)解题报告及测试数据
Save the Students Time Limit:134MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descri ...
- PICK定理模板
PICK定理: S=I+O/2-1 S为多边形面积,I多边形内部的格点,O是多边形边上的格点 其中边上格点求法: 假设两个点A(x1,y1),B(x2,y2) 线段AB间格点个数为gcd(abs(x1 ...
随机推荐
- 【转载】漫谈C++:良好的编程习惯与编程要点
原文: 漫谈C++:良好的编程习惯与编程要点 阅读目录 以良好的方式编写C++ class Class with pointer member(s):记得写Big Three static与类 正文 ...
- MySQL主从失败报错误: Got fatal error 1236
一.问题原因及报错误信息 由于MySQL主库意外重启,导致从库无法同步报错如下: 登录从库查看主从同步的错误信息 [root@--- mysql]# vim mysqld-error.log -- : ...
- weka使用笔记3---classfily API调用
分类器在数据挖掘中的作用不言而喻,weka中的分类器有很多种类型,但是weka在输出结果中,只输出了一个分类的预测的类型,没有输出分类的得分,有一些不给力.如果想知道得分和其预测的类的话,就得调用we ...
- java 定义三分钟之前的时间
public String getCurrentTime(){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ...
- 通知的多线程问题 iOS
发送通知在子线程,接受也在子线程.如果子线程操作UI,会打印一推日志,告诉我们应该主线程操作.
- 如何在makfile中查看变量的值
在makefile中查看变量的取值是多少应该是一个比较麻烦的问题,但是本大神自己研究出一个十分方便的方法.这个方法十分简单.现在介绍如下 如果在一个十分复杂庞大的makefile文件中,有个地方用到一 ...
- selenium自动化之稳定版本环境介绍
大家都知道,目前selenium版本已经升级到3.0了,selenium3只是在selenium2的基础上做了一些调整,最明显的区别就是 selenium2对Firefox的支持最高只支持46及以下版 ...
- Git生成多个ssh key
在实际的工作中, 有可能需要连接多个远程仓库, 例如我想连接私有仓库.GitLab官网.GitHub官网, 那么同一台电脑就要生成多个ssh key: ssh-keygen -t rsa -C &qu ...
- 近中期3D编程研究目标
近几年一直在用业余时间研究3D编程,研究的中期目标是建立一个实用的开源3D编程框架.3D编程技术最直接的应用是开发游戏,所以3D编程框架也就是3D游戏开发框架.在我看来,游戏是否好玩的关键是能否为玩家 ...
- 解决登录linux输入密码问题
1.使用密钥 ssh-keyssh -i .ssh/*.key root@<ip_addr> 2.使用sshpass 安装 rpm 包:yum install sshpass 配置文件: ...