题意:
求出三个点(0,0),(n,m),(p,0)组成的三角形中整点的数量(不包括边界)
题解:
数据范围不大考虑暴力:
可以分别计算出对于一条直线方程来说某个点x下方有多少个整点。
对于p<n的情况先计算(0,0),(n,m),(n,0)的三角形内整点数量再减去(p,0),(n,m),(n,0)内整点数量加上边界的点数。
对于p>n的情况分别计算两个三角形的点数相加在加上直线x=n上的m-1个点。对于部分直角三角形的情况(n=p或n=0)不能加上直线x=n上的点。
#define _CRT_SECURE_NO_WARNINGS
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const LL N = 1e3 + 10, MOD = 1e9 + 7, INF = 0x3f3f3f3f;
void solve()
{
int n, m, p, ans = 0;
scanf("%d%d%d", &n, &m, &p);
for (int i = 1; i < n; ++i)
{
int t = i * m;
ans += (t - 1) / n;//不计数边界上的点,故-1
}
if (p < n)
{
for (int i = p + 1; i < n; ++i)
{
LL t = (i - p) * m;
ans -= t / (n - p);
}
}
else if (p > n)
{
if (n)ans += m - 1;
for (int i = p - 1; i > n; --i)
{
LL t = (p - i) * m;
ans += (t - 1) / (p - n);
}
}
printf("%d\n", ans);
}
int main()
{
int T = 1;
//scanf("%d", &T);
while (T--)
{
solve();
}
return 0;
}
被迫营业的第二天w