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');
}
}