제출 #1134212

#제출 시각아이디문제언어결과실행 시간메모리
1134212StefanSebez디지털 회로 (IOI22_circuit)C++17
100 / 100
737 ms102984 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
const int N=1e5+50,mod=1000002022;
inline ll Plus(ll x,ll y){x%=mod;y%=mod;return (x+y)%mod;}
inline ll Puta(ll x,ll y){x%=mod,y%=mod;return (x*y)%mod;}
ll Pow(ll a,ll b){
    ll res=1;
    for(ll x=a;b;x=Puta(x,x),b>>=1) if(b&1) res=Puta(res,x);
    return res;
}
//glupavi mod nije prost
vector<pair<int,int>>faktor[N+50];bool was[N+50];
struct Broj{
    set<pair<int,int>>st;
    Broj(){}
    Broj(int x){
        if(x>1) for(auto i:faktor[x]) st.insert(i);
    }
    void Pomnozi(Broj x){
        for(auto [p,num]:x.st){
            auto lb=st.lower_bound({p,0});
            if(!(lb==st.end()||(*lb).fi!=p)){
                num+=(*lb).se;
                st.erase(lb);
            }
            st.insert({p,num});
        }
    }
    void Podeli(Broj x){
        for(auto [p,num]:x.st){
            auto lb=st.lower_bound({p,0});
            if(lb==st.end()||(*lb).fi!=p) continue;
            num=(*lb).se-num;
            st.erase(lb);
            st.insert({p,num});
        }
    }
    ll Vrednost(){
        ll res=1;
        for(auto [p,num]:st) res=Puta(res,Pow(p,num));
        return res;
    }
};
vector<int>E[2*N];
int a[N],n,m,par[2*N];
ll b[2*N];
Broj val1[2*N],Val1[2*N];
void DFSsetup(int u){
    val1[u]=Broj(E[u].size());
    for(auto i:E[u]){
        Val1[i]=Val1[u];
        Val1[i].Pomnozi(Broj(E[u].size()));
        DFSsetup(i);
        val1[u].Pomnozi(val1[i]);
    }
    if(E[u].empty()) val1[u]=Broj();
}
struct SegTree{
    int root,nc,lc[2*N],rc[2*N];ll sum[2*N],sum1[2*N];bool lazy[2*N];
    void Build(int &c,int ss,int se){
        c=++nc;
        if(ss==se){sum1[c]=b[ss];return;}
        int mid=ss+se>>1;
        Build(lc[c],ss,mid),Build(rc[c],mid+1,se);
        sum1[c]=Plus(sum1[lc[c]],sum1[rc[c]]);
    }
    void update(int c){sum[c]=Plus(sum1[c],mod-sum[c]);lazy[c]^=1;}
    void push(int c){if(!lazy[c])return;update(lc[c]),update(rc[c]),lazy[c]=0;}
    void Update(int c,int ss,int se,int qs,int qe){
        if(qs>qe||qe<ss||se<qs) return;
        if(qs<=ss&&se<=qe){update(c);return;}
        int mid=ss+se>>1;push(c);
        Update(lc[c],ss,mid,qs,qe),Update(rc[c],mid+1,se,qs,qe);
        sum[c]=Plus(sum[lc[c]],sum[rc[c]]);
    }
}ST;
void init(int n1, int m1, std::vector<int> P, std::vector<int> A){
    for(int i=2;i<=N;i++){
        if(!was[i]){
            for(int j=i;j<=N;j+=i){
                was[j]=true;
                int temp=j,num=0;
                while(temp%i==0) temp/=i,num++;
                faktor[j].pb({i,num});
            }
        }
    }
    n=n1,m=m1;
    for(int i=0;i<P.size();i++) par[i]=P[i],E[par[i]].pb(i);
    for(int i=0;i<m;i++) a[i]=A[i];
    DFSsetup(0);
    for(int i=0;i<m;i++){
        int u=i+n;Broj x=val1[0];x.Podeli(Val1[u]);
        b[i]=x.Vrednost();
    }
    ST.Build(ST.root,0,m-1);
    for(int i=0;i<m;i++) if(a[i]==1) ST.Update(ST.root,0,m-1,i,i);
}
int count_ways(int L, int R){
    L-=n,R-=n;
    ST.Update(ST.root,0,m-1,L,R);
    return ST.sum[1];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...