对 n n n进行唯一分解,得到若干素数的幂乘积 p i a 1 × p i a 2 × . . . p n a n p_i^{a_1} \times p_i^{a_2} \times...p_n^{a_n} pia1×pia2×...pnan,那么答案为: f ( x ) = ∏ i = 1 n g ( p i , a i ) f(x)=\prod_{i=1}^n g(p_i,a_i) f(x)=∏i=1ng(pi,ai)
其中 g ( p i , a i ) = { 1 f o r p i = 2 1 f o r p i % 4 = 3 & a i % 2 = 0 0 f o r p i % 4 = 3 & a i % 2 = 1 a i + 1 f o r p i % 4 = 1 g(p_i,a_i) = \left\{ \begin{array}{rcl} 1 &{for} & p_i=2\\ 1 & {for} & p_i\%4=3~\&~a_i\%2=0 \\ 0 & {for} & p_i\%4=3~\&~a_i\%2=1 \\ a_i+1 & {for} & p_i\%4=1 \end{array}\right. g(pi,ai)=⎩⎪⎪⎨⎪⎪⎧110ai+1forforforforpi=2pi%4=3 & ai%2=0pi%4=3 & ai%2=1pi%4=1
视频证明链接:https://www.bilibili.com/video/av12131743/
使用Pollard Rho质因数分解(注意是对 r 2 r^2 r2分解而不是 r r r):
//
// Created by Happig on 2020/8/25
//
#include <bits/stdc++.h>
#include <unordered_map>
#include <unordered_set>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ins insert
#define Vector Point
#define lowbit(x) (x&(-x))
#define mkp(x, y) make_pair(x,y)
#define mem(a, x) memset(a,x,sizeof a);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
const double eps = 1e-8;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double dinf = 1e300;
const ll INF = 1e18;
const int Mod = 1e9 + 7;
const int maxn = 2e5 + 10;
struct BigIntegerFactor {
const static int maxm = 1e6 + 10;
ll prime[maxm], p[maxm], sz, cnt;
ll fac[10010], num[10010];
inline ll mul(ll a, ll b, ll p) { //wa了尝试下面的慢速乘或者改为__int128
if (p <= 1000000000) return a * b % p;
else if (p <= 1000000000000LL) return (((a * (b >> 20) % p) << 20) + (a * (b & ((1 << 20) - 1)))) % p;
else {
ll d = (ll) floor(a * (long double) b / p + 0.5);
ll ret = (a * b - d * p) % p;
if (ret < 0) ret += p;
return ret;
}
}
inline ll slow_mul(ll a, ll b, ll Mod) {
ll ans = 0;
while (b) {
if (b & 1) ans = (ans + a) % Mod;
a = (a + a) % Mod;
b >>= 1;
}
return ans;
}
void init(int up) { //传入的参数不能超过maxm,根据数据范围来定,1e5wa了就改1e6试试
int tot = 0;
sz = up - 1;
for (int i = 1; i <= sz; i++) p[i] = i;
for (int i = 2; i <= sz; i++) {
if (p[i] == i) prime[tot++] = i;
for (int j = 0; j < tot && 1LL * i * prime[j] <= sz; j++) {
p[i * prime[j]] = prime[j];
if (i % prime[j] == 0) break;
}
}
}
inline ll qkp(ll x, ll n, ll p) {
ll ans = 1;
while (n) {
if (n & 1) ans = mul(ans, x, p);
x = mul(x, x, p);
n >>= 1;
}
return ans;
}
inline bool check(ll a, ll n) {
ll t = 0, u = n - 1;
while (!(u & 1)) t++, u >>= 1;
ll x = qkp(a, u, n), xx = 0;
while (t--) {
xx = mul(x, x, n);
if (xx == 1 && x != 1 && x != n - 1) return false;
x = xx;
}
return xx == 1;
}
inline bool miller(ll n, ll k) { //检测一个数n是否为素数,一般k取20即可
if (n == 2) return true;
if (n < 2 || !(n & 1)) return false;
if (n <= sz) return p[n] == n;
for (int i = 0; i <= k; i++) {
if (!check(rand() % (n - 1) + 1, n)) return false;
}
return true;
}
inline ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a % b);
}
inline ll Abs(ll x) {
return x < 0 ? -x : x;
}
inline ll Pollard_rho(ll n) {
ll s = 0, t = 0, c = rand() % (n - 1) + 1, v = 1, ed = 1;
while (1) {
for (int i = 1; i <= ed; i++) {
t = (mul(t, t, n) + c) % n;
v = mul(v, Abs(t - s), n);
if (i % 127 == 0) {
ll d = gcd(v, n);
if (d > 1) return d;
}
}
ll d = gcd(v, n);
if (d > 1) return d;
s = t, v = 1, ed <<= 1;
}
}
void getfactor(ll n) { //得到有重复的质因子
if (n <= sz) {
while (n != 1) fac[cnt++] = p[n], n /= p[n];
return;
}
if (miller(n, 6)) fac[cnt++] = n;
else {
ll d = n;
while (d >= n) d = Pollard_rho(n);
getfactor(d);
getfactor(n / d);
}
}
void print(ll x) { //打印"质因子-个数"
cnt = 0;
getfactor(x);
int k = 1;
num[0] = 1;
sort(fac, fac + cnt);
for (int i = 1; i < cnt; i++) {
if (fac[i] == fac[i - 1])
num[k - 1]++;
else {
num[k] = 1;
fac[k++] = fac[i];
}
}
cnt = k;
for (int i = 0; i < cnt; i++)
printf("%lld %lld\n", fac[i], num[i]);
}
void solve(ll x) { //进行其他操作
cnt = 0;
getfactor(x);
int k = 1;
num[0] = 1;
sort(fac, fac + cnt);
for (int i = 1; i < cnt; i++) {
if (fac[i] == fac[i - 1])
num[k - 1]++;
else {
num[k] = 1;
fac[k++] = fac[i];
}
}
cnt = k;
}
} Q;
int main() {
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
ll r;
Q.init(100000);
cin >> r;
r *= r;
Q.solve(r);
ll ans = 1;
for (int i = 0; i < Q.cnt; i++) {
if (Q.fac[i] == 2) continue;
if (Q.fac[i] % 4 == 1) ans *= Q.num[i] + 1;
else {
if (Q.num[i] & 1) {
ans = 0;
break;
}
}
}
cout << ans * 4 << "\n";
return 0;
}