首先YM XLK大犇犇
BlinKer 20:45:36
傻逼暴力。
等会我写。。
大概意思就是如果是R*C的
过
R+C-gcd(R,C)
BlinKer 20:46:15
显然gcd(R,C)是n的约数。
暴力这个东西。
一共是lgn种可能。
然后On暴力R或C
算另一个。
看是不是gcd为那个数。
傻逼暴力。
等会我写。。
大概意思就是如果是R*C的
过
R+C-gcd(R,C)
BlinKer 20:46:15
显然gcd(R,C)是n的约数。
暴力这个东西。
一共是lgn种可能。
然后On暴力R或C
算另一个。
看是不是gcd为那个数。
从以上的文字中很容易可以看出这样的水题对于大犇来说已经不值一提了。
作为一个蒟蒻,我整理一下大犇的思想:
观察或者打表或者数学推导(一般大犇都这么搞的),可以发现,穿过的网格数等于r+c-gcd(r,c)。
然后就有r+c-gcd(r,c)=n
即r+c=n+gcd(r,c)
两边除gcd(r,c)
可知gcd(r,c)一定是N的因数(其他三个都是整数)
所以预处理出N的因数,再穷举R判断即可
Code:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int gcd(int a,int b){
if (a%b==0) return b;
if (b%a==0) return a;
return gcd(b,a%b);
}
int num[10001];
int main(){
int n,t=0;
cin >>n;
for (int i=1;i<=int(sqrt(n));i++)
if (n%i==0){
num[++t]=i;num[++t]=n/i;
if (num[t]==num[t-1]) t--;
}
int ans=0;
for (int r=1;r<=n;r++)
for (int i=1;i<=t;i++){
int c=n+num[i]-r;
if ((c<=r)&&(gcd(c,r)==num[i])){
ans++;
}
}
cout <<ans <<endl;
return 0;
}