RT,感觉自己写的没啥问题?看了几遍题解代码也没发现错在哪?目前是,R≤103 的根号分治不会挂,但是 R 的范围变大了之后就会挂,但是我理论上已经处理过范围变大的情况了,猜测显然是 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分
*/