首页 > 技术文章 > 浙财16th校赛 F因子

PdrEam 2020-12-16 22:47 原文

没啥好说的,当时打线段树打太慢了,差一个查询没打出来。

#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\n",ans%mod);
        }
    }
    return 0;
}

推荐阅读