没啥好说的,当时打线段树打太慢了,差一个查询没打出来。
#include<bits/stdc++.h> #define inf 0x3f3f3f3f #define ll long long using namespace std; const int N=2e5+7; const ll mod = 998244353; ll p[50]; ll n,m; ll s[30][N],a[N]; inline ll lowbit(ll x){ return x&-x; } ll sum(ll x,ll C[]){ ll res=0; while(x>0){ res=(res+C[x])%mod; x-=lowbit(x); } return res%mod; } void add(ll x,ll v,ll C[]){ while(x<=n){ C[x]=(C[x]+v)%mod; x+=lowbit(x); } } void pre(){ int pos=0; for(int i=2;i<=72;++i){ int flag=1; for(int j=2;j*j<=i;++j){ if(i%j==0){ flag=0;break;} } if(flag==1) p[++pos]=i; } } void did(ll x,ll pos,ll f){ for(int j=1;j<=20;++j){ if(x==1) break; ll num=0; while(x%p[j]==0){ if(f==1)num++; else num--; x=x/p[j]; } add(pos,num,s[j]); } } int main(){ pre(); scanf("%lld%lld",&n,&m); for(int i=1;i<=n;++i){ scanf("%lld",&a[i]); did(a[i],i,1); } while(m--){ ll op,aa,bb; scanf("%lld%lld%lld",&op,&aa,&bb); if(op==1){ did(a[aa],aa,-1); a[aa]=bb; did(a[aa],aa,1); } else{ ll ans=1; for(int i=1;i<=20;++i){ ll now=((sum(bb,s[i])+mod)%mod-sum(aa-1,s[i])+mod)%mod; ans=ans*(now+1)%mod; } printf("%lld ",ans%mod); } } return 0; }