TLE 96求助
查看原帖
TLE 96求助
271375
ywli08楼主2025/1/15 11:21

rt,已经全部照着题解改了一遍,跑的还是很慢
提交记录

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
const ll mod = 998244353;

namespace fastIO{
    auto gc = [](){
        #ifdef WIN
            char c = _getchar_nolock();
        #else
            char c = getchar_unlocked();
        #endif
        return c;
    };
    auto pc = [](char x){
        #ifdef WIN
            _putchar_nolock(x);
        #else
            putchar_unlocked(x);
        #endif
    };
    template<typename T>
    inline T read(){
        T k = 0; int f = 1;
        char c = gc();
        while(!isdigit(c)){if(c == '-') f = -1; c = gc();}
        while(isdigit(c)){k = (k << 3) + (k << 1) + (c ^ '0'); c = gc();}
        return f*k;
    }
    template<typename T>
    inline void write(T x){
        if(x < 0) pc('-'), x = -x;
        if(x > 9) write(x / 10);
        pc((x % 10) ^ '0');
    }
};

using namespace fastIO;

template<typename T>
T powmod(T a, ll p, T mod){
    T ans = 1;
    while(p){
        if(p & 1){
            ans = ans * a % mod;
        }
        a = a * a % mod;
        p >>= 1;
    }
    return ans;
}

vector<ll> p;
bool ntp[maxn];

void get_prime(ll n){
    ntp[0] = ntp[1] = 1;
    for(ll i = 2;i <= n;i++){
        if(!ntp[i]) p.push_back(i);
        for(ll j : p){
            if(i * j > n) break;
            ntp[i * j] = 1;
            if(i % j == 0) break;
        }
    }
}

struct que{
    int l, r;
    int id;
    int L;
}lst[maxn];

int n, m;
int sq;
int a[maxn], mx;
ll ans[maxn];
ll ppr[maxn];
int sum[maxn];

ll vec[maxn], st[maxn], len;
int rst[maxn], cnt;
int id[maxn];

int c[maxn];

int main(){
    ios::sync_with_stdio(0);
    n = read<int>(); m = read<int>();
    for(int i = 1;i <= n;i++){
        a[i] = read<int>(); mx = max(a[i], mx);
    }
    sq = sqrt(mx);
    get_prime(sq);
    for(int i = 1;i <= m;i++){
        lst[i].l = read<int>(), lst[i].r = read<int>();
        lst[i].id = i; ans[i] = 1; lst[i].L = lst[i].l / sq;
    }
    for(int i = 0;i < p.size();i++){
        ll inv = powmod(p[i], mod - 2, mod);
        for(auto [j, k] = tuple<int, ll>{0, p[i]};j <= n;j ++, k = k * k % mod) ppr[j] = k;
        for(ll j = p[i];j <= mx;j = j * p[i]){
            sum[0] = 0;
            for(int k = 1;k <= n;k++){
                sum[k] = sum[k - 1] + (a[k] % j == 0);
            }
            for(int k = 1;k <= m;k++){
                ans[k] = ans[k] * ppr[sum[lst[k].r] - sum[lst[k].l - 1]] % mod * inv % mod;
            }
        }
        for(int j = 1;j <= n;j++){while(a[j] % p[i] == 0) a[j] /= p[i];}
    }
    sort(lst + 1, lst + m + 1, [](que x, que y){
        return x.L < y.L || x.L == y.L && x.r < y.r;
    });
    for(int i = 1;i <= n;i++){
        if(a[i] == 1){
            a[i] = 0;
            continue;
        }
        if(!id[a[i]]){
            rst[++cnt] = a[i];
            id[a[i]] = cnt;
        }
        c[a[i] = id[a[i]]] ++;
    }
    for(int i = 1;i <= cnt;i++){
        st[i] = ++len;
        vec[len] = 1; vec[++len] = rst[i], c[i] --;
        while(c[i] --){
            ++len, vec[len] = vec[len - 1] * vec[len - 1] % mod;
        }
        c[i] = 0;
    }
    ll res = 1, inv = 1;
    for(int i = 1, l = 1, r = 0;i <= m;i++){
        while(l > lst[i].l){
            -- l;
            if(a[l]) c[a[l]] ++, res = res * vec[st[a[l]] + c[a[l]]] % mod;
        }
        while(r < lst[i].r){
            ++ r;
            if(a[r]) c[a[r]] ++, res = res * vec[st[a[r]] + c[a[r]]] % mod;
        }
        while(l < lst[i].l){
            if(a[l]) inv = inv * vec[st[a[l]] + c[a[l]]] % mod, c[a[l]] --;
            l ++;
        }
        while(r > lst[i].r){
            if(a[r]) inv = inv * vec[st[a[r]] + c[a[r]]] % mod, c[a[r]] --;
            r --;
        }
        // ans[lst[i].id] = ans[lst[i].id] * res % mod * powmod(inv, mod - 2, mod) % mod;
    }
    for(int i = 1;i <= m;i++){
        write(ans[i]), pc('\n');
    }
}
2025/1/15 11:21
加载中...