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;
}