[关键字]:数学 解析几何
[题目大意]:给出n,m,p,问由(0,0)(n,m)(p,0)围成的三角形型内部有几个由整数构成的点。
//=============================================================================================
[分析]:据说有个皮克定律可以解决,但是本菜不会……所以就用了最笨的解析几何去做。计算出(0,0)和(n,m)构成的直线的解析式是:y=(xm)/n;(n,m)和(p,0)的解析式是:y=(p-x)m/(p-n)然后枚举x,求出对应的y。然后就可算出x这条直线上有几个可以选的点。要注意的是:1、计量避免浮点计算,否则很不好办;2、要分三种情况讨论:p>n p==n p<n,其实三种情况都很想代码也差不多,边界考虑清楚代码完全可也copy。
[代码]:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int N,M,P,ans=0;
int main()
{
scanf("%d%d%d",&N,&M,&P);
//printf("%d %d %d\n",N,M,P);
for (int i=1;i<=N;i++)
{
int y1=(i*M)/N;
float y2=((float)i*M)/(float) N;
//printf("%d %.2f %d\n",i,y2,y1);
if (y1==y2) ans+=y1-1; else ans+=y1;
}
//printf("%d\n",ans);
if (P>N)
{
for (int i=N+1;i<P;i++)
{
int y1=(M*(P-i))/(P-N);
float y2=((float)M*(P-i))/(float) (P-N);
//printf("%d %.2f %d\n",i,y2,y1);
if (y1==y2) ans+=y1-1; else ans+=y1;
}
//printf("%d\n",ans);
}
if (P<=N) ans-=M-1;
//printf("%d\n",(P<N));
if (P<N)
{
for (int i=P+1;i<N;i++)
{
int y1=(M*(P-i))/(P-N);
//printf("%d %.2f %d\n",i,y2,y1);
ans-=y1;
}
//printf("%d\n",ans);
}
printf("%d\n",ans);
return 0;
}