这是我没有开 define int long long 的评测结果:
这是我开了 define int long long 的评测结果:

但是如果开了这个,空间会爆掉,我尝试控制使其不超出 int ,但就TLE。
这是蒟蒻的代码:
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define INF32_MAX 2147483647
const int N = 1e6 + 100;
const long long INF = 104857601;
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
x = x * 10 + ch - 48;
ch = getchar();
}
return x * f;
}
int prime[N / 10], cnt;
int mu[N];
bitset<N> st;
long long pow(long long a, long long b, long long p = INF)
{
long long ans = 1;
while (b)
{
if (b & 1)
ans = ans * a % p;
a = a * a % p;
b = b >> 1;
}
return ans % INF;
}
long long fac = 1;
void init(int n)
{
mu[1] = 1;
for (int i = 2; i <= n; i++)
{
fac = fac * i % INF;
if (!st[i])
prime[++cnt] = i,
mu[i] = -1;
for (int j = 1; prime[j] * i <= n; j++)
{
st[prime[j] * i] = true;
if (i % prime[j] == 0)
break;
mu[prime[j] * i] = -mu[i];
}
}
for (int i = 1; i <= n; i++)
mu[i] += mu[i - 1] % INF;
return;
}
inline int g(int k, int x)
{
return k / (k / x);
}
long long calc(int n)
{
int ans = 0;
for (int l = 1, r; l <= n; l = r + 1)
{
r = g(n, l);
(ans += 1ll * ((n / l) * (n / l) % (INF - 1)) * ((mu[r] - mu[l - 1]) + INF - 1) % (INF - 1));
}
return 1ll * ans % (INF - 1);
}
int n;
signed main()
{
n = read();
init(n);
long long ans = 1;
long long ans1 = pow(fac, 2 * n, INF);
long long f = 1;
for (int l = 1, r; l <= n; l = r + 1)
{
f = 1;
r = g(n, l);
for (int i = l; i <= r; i++)
f = f * i % INF;
int t = 1ll * pow(f * f % INF, calc(n / l), INF) % (INF);
ans = ans * t % INF;
}
cout << (ans1 * pow(ans, INF - 2, INF)) % (INF) << endl;
return 0;
}
请各位大佬指导,悬赏一个关注