题解:P4388 付公主的矩形
mahaorui2012 · · 题解
思路
首先,对于一个长为
证明
不妨将对角线所穿过的格子数量转化为一从左上角运动到右下角的点的所穿过的格子数量,两者一定相等。
这个点应共横向移动
又该点每经过一个边,其经过的格子数量就会增加
最后,在该点经过非左上角或右下角格点时,此时只经过了一条边(两条边重叠在了一起),但被计算了两次。又由下述引理可知,该点共经过
引理证明
首先,当
则此时对角线经过了
对于
又
此时可得原题相当于关于
化简方程
设
易知该方程解的组数与原方程解的组数相等。
又
可以枚举
此时用上公式计算出
AC CODE
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int calc(const int& i){
int ret=0;
for(int p=1;p<=n/i+1-p;++p){
if(__gcd(p,n/i+1-p)==1){
++ret;
}
}
return ret;
}
int main(){
cin>>n;
long long ans=0;
for(int i=1;i*i<=n;++i){
if(!(n%i)){
ans+=calc(i);
if(i*i!=n){
ans+=calc(n/i);
}
}
}cout<<ans;
return 0;
}