WA70,不知道错在哪啊??
查看原帖
WA70,不知道错在哪啊??
251723
Schwarzkopf_Henkal楼主2021/4/30 08:28

RT,感觉自己写的没啥问题?看了几遍题解代码也没发现错在哪?目前是,R103R\le 10^3 的根号分治不会挂,但是 RR 的范围变大了之后就会挂,但是我理论上已经处理过范围变大的情况了,猜测显然是 insert 函数挂,但是不知道挂哪,求助

#include<bits/stdc++.h>
using namespace std;
const long long Mod=998244353;
long long T,L,R,mk[10000005],pr1[114514],pr2[665000],t1,t2,S;
bitset<455>a[455];
unordered_map<int,bitset<455>>mts;
void insert(int u){
    bitset<455>v;
    for(int i=1;i<=t1&&u!=1;i++){
        while(u%pr1[i]==0){
            u/=pr1[i];
            v[i]=!v[i];
        }
    }
    if(u!=1){
        if(!mts[u].any()){
            mts[u]=v;
            // S++;
            return;
        }
        v^=mts[u];
    }
    for(int i=t1;i>=1;i--)
        if(v[i]){
            if(!a[i].any()){
                a[i]=v;
                S++;
                return;
            }
            v^=a[i];
        }
}
void clear(){
    S=0;
    mts.clear();
    for(int i=1;i<=t1;i++)
        a[i].reset();
}
long long Pow(long long u,long long v){
    long long res=1;
    while(v){
        if(v&1)
            res=res*u%Mod;
        u=u*u%Mod;
        v>>=1;
    }
    return res;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    for(int i=2;i<=10000000;i++)
        if(!mk[i]){
            if(i<=3200)
                pr1[++t1]=i;
            pr2[++t2]=i;
            if(1ll*i*i<=10000000)
                for(int j=i*i;j<=10000000;j+=i)
                    mk[j]=1;
        }
    cin>>T;
    while(T--){
        clear();
        cin>>L>>R;
        if(R-L+1<=7000){
            for(int i=L;i<=R;i++)
                insert(i);
        }else {
            for(int i=1;i<=t2&&pr2[i]<=R;i++)
                if(R/pr2[i]!=(L-1)/pr2[i])
                    S++;
        }
        cout<<Pow(2,R-L+1-S)<<'\n';
    }
}/*
首先,预处理根号以内的质数,
然后bitset预处理谔谔。
不过,这样不会超时吗?
对啊,它不是要求O(n)吗

看起来是个大nb题但是为什么这个只有紫
好棒/se有50分
*/
2021/4/30 08:28
加载中...