为什么会莫名其妙的TLE呢?关于define int long long的玄学
查看原帖
为什么会莫名其妙的TLE呢?关于define int long long的玄学
817044
cjwdyzxfblzs楼主2023/6/1 16:56

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

但是如果开了这个,空间会爆掉,我尝试控制使其不超出 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;
}

请各位大佬指导,悬赏一个关注

2023/6/1 16:56
加载中...