P4388 付公主的矩形 题解

博客园食用更佳 | 传送门

简要题意

求有多少矩形对角线经过的方格数为给定的 \(n\),其中 \(R \times C\)\(C \times R\) 视为同一个矩形。

解题思路

首先考虑怎么求一个已知矩形对角线穿过的方格数。

对于长宽不互质的,可以先同时除以公因数,转成长宽互质,格子数也对应成倍数关系,固不考虑。

然后可以自己多画几个找规律,就可以得到一个结论:穿过的矩形数是 \(x+y-1\)

(具体证明可以看一下其他大佬的题解,我太菜了只会找规律)

由于不互质的存在,我们要枚举 \(n\) 的所有因数进行处理。对于每个因数一一枚举 \(x\),判断 \(x\)\(y\) 是否互质,互质就计入答案。为了避免算重,只考虑 \(x\) 小于 \(y\) 的情况就好。

时间复杂度嘛,应该是:因数和 \(\times\) gcd 的复杂度。调和级数可以得知因数和最多最多不超过 \(n\ln n\) 并且远远达不到,gcd 是 \(\log n\) 的。顶天了也才 \(O(n\ln n \log n)\) ,更何况还达不到。

Code Time

#include<bits/stdc++.h>
using namespace std;

int ans;
int gcd(int x,int y){if(!y)return x;return gcd(y,x%y);}
void sol(int n){
	++n;
	for(int x=1;x<=n-x;++x)
		if(gcd(x,n-x)==1)	++ans;
}

int main(){

	int n;cin>>n;
	for(int i=1;i*i<=n;++i)
		if(n%i==0){
			sol(i);
			if(n/i!=i)	sol(n/i);
		}
	cout<<ans;

	return 0;
}
posted @ 2022-09-10 09:52  _yolanda  阅读(60)  评论(0编辑  收藏  举报