洛谷P4388 付公主的矩形

首先有一个结论
对于一个的矩形,经过格子数目为
更一般的,可由上式化简,对于,经过格子数目为

证明有多种
给出一种我当时想出来的

  • 中对角线只有初末位置在格点上
  • 当对角线穿过某一网格边时,必然会在两边经过各一个格子
  • 对角线穿过的网格边数显然为
  • 由于中间无格点,按照上述计算时中间每个格子会被计算到两次
  • 初末位置的格子仅会被计算到一次
  • 化简后可得格子数为

暴力统计就能过了,复杂度比较玄学,大概是为一个不是很大常数(我猜的)

其实还有更有理有据的做法

每一对都会被算到两次,但只会被算到一次
复杂度

代码为暴力统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<cstdio>
const int N=1e6+50;
int n,ans=0,idx=0,w[N];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main()
{
scanf("%d",&n);
for(int i=1;i*i<=n;i++)
if (n%i==0)
{
w[++idx]=i;
if (i*i!=n) w[++idx]=n/i;
}
for(int i=1;i<=idx;i++)
{
int sz=w[i]+1;
for(int k=1;k<=sz/2;k++)
if (gcd(k,sz-k)==1) ans++;
}
printf("%d\n",ans);
return 0;
}