题目:https://loj.ac/problem/2978

题解:https://www.cnblogs.com/Paul-Guderian/p/10248782.html

第 i 个数的 bitset 的第 j 位表示 i 是否含有奇数个 “第 j 个质数” 。

想到用 bitset ,就开始考虑怎样 DP ……

其实是求选一些数,使得它们的 bitset 异或和为 0 。所以求线性基,答案就是 2R-L+1-线性基大小

然后考虑根号分治。

大于 \( \sqrt{n} \) 的质数,每个数最多含有其一次方。所以一个大于 \( \sqrt{n} \) 的质数一旦出现,线性基里就一定有它。

所以对小于 \( \sqrt{n} \) 的约 500 个质数做线性基。

找出每个数的最大质因子,如果是大于 \( \sqrt{n} \) 的,直接 dec++(dec 是记录的线性基大小);如果该质因子已经出现过,就把该数的剩余部分异或掉该质因子第一次出现的那个数的剩余部分,然后尝试加入线性基。

似乎区间长度 >= 6000 的话,一个质因子一旦出现就一定会在线性基里。判断小于 \( \sqrt{n} \) 的质因子是否出现,只需看 (L-1)/pri < R/pri 。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cmath>
#define ll long long
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=,M=1e7+,mod=;
int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;} int L,R,lm,pri[M],cnt,mxd[M],mnd[M],dy[M];
int q[],dfn[M],bin[M];bool vis[M];
bitset<N> bs[N],nw,pr;
bool cmp(int u,int v){return mxd[u]<mxd[v];}
void init()
{
int n=1e7;lm=sqrt(n); ll d;
for(int i=;i<=n;i++)
{
if(!vis[i]){ pri[++cnt]=i;dy[i]=cnt;mxd[i]=mnd[i]=i;}
for(int j=;j<=cnt&&(d=(ll)i*pri[j])<=n;j++)
{
vis[d]=; mnd[d]=pri[j]; mxd[d]=mxd[i];
if(i%pri[j]==)break;
}
}
for(int i=;i<=cnt;i++)
if(pri[i]>lm){cnt=i-;break;}
bin[]=;for(int i=;i<=n;i++)bin[i]=upt(bin[i-]<<);
}
void get(int x)
{
if(mxd[x]>lm)x/=mxd[x]; nw.reset();
while(x>)
{
int t=,d=mnd[x];
while(mnd[x]==d)x/=d,t++;
if(t&)nw.set(dy[d]-);
}
}
int Ins()
{
for(int i=;i<cnt;i++)
if(nw[i])
{
if(bs[i][i])nw^=bs[i];
else {bs[i]=nw;return ;}
}
return ;
}
void solve1()
{
int tot=; for(int i=L;i<=R;i++)q[++tot]=i;
sort(q+,q+tot+,cmp);
for(int i=;i<cnt;i++)bs[i].reset();
int dec=,d2=;
for(int i=,cr;i<=tot;i++)
{
cr=q[i]; get(cr);
if(mxd[cr]<=lm)dec+=Ins();
else if(mxd[cr]!=mxd[q[i-]])
{ d2++; pr=nw;}
else
{ nw^=pr; dec+=Ins();}
if(dec==cnt+)break;//can't cal d2!!!
}
printf("%d\n",bin[tot-dec-d2]);
}
void solve2(int tim)
{
int dec=;
for(int i=L;i<=R;i++)
{
int cr=mxd[i];
if(cr>lm&&dfn[cr]!=tim)dfn[cr]=tim,dec++;
}
for(int i=;i<=cnt;i++)
if((L-)/pri[i]<R/pri[i])dec++;
printf("%d\n",bin[R-L+-dec]);
}
int main()
{
init(); int T=rdn();
while(T--)
{
L=rdn(),R=rdn();
if(R-L+>=)solve2(T+);
else solve1();
}
return ;
}

LOJ 2978 「THUSCH 2017」杜老师——bitset+线性基+结论的更多相关文章

  1. LOJ #2978「THUSCH 2017」杜老师

    听说LOJ传了THUSC题赶紧上去看一波 随便点了一题都不会做想了好久才会写暴力爆了一发过了... LOJ #2978 题意 $ T$次询问,每次询问$ L,R$,问有多少种选取区间中数的方案使得选出 ...

  2. loj#2978. 「THUSCH 2017」杜老师(乱搞)

    题面 传送门 题解 感谢yx巨巨 如果一个数是完全平方数,那么它的所有质因子个数都是偶数 我们把每一个数分别维护它的每一个质因子的奇偶性,那么就是要我们选出若干个数使得所有质因子的个数为偶数.如果用线 ...

  3. @loj - 2977@ 「THUSCH 2017」巧克力

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...

  4. LOJ 2980 「THUSCH 2017」大魔法师——线段树

    题目:https://loj.ac/problem/2980 线段树维护矩阵. 然后是 30 分.似乎是被卡常了?…… #include<cstdio> #include<cstri ...

  5. LOJ 2979 「THUSCH 2017」换桌——多路增广费用流

    题目:https://loj.ac/problem/2979 原来的思路: 优化连边.一看就是同一个桌子相邻座位之间连边.相邻桌子对应座位之间连边. 每个座位向它所属的桌子连边.然后每个人建一个点,向 ...

  6. LOJ 2997 「THUSCH 2017」巧克力——思路+随机化+斯坦纳树

    题目:https://loj.ac/problem/2977 想到斯坦纳树.但以为只能做 “包含一些点” 而不是 “包含一些颜色” .而且不太会处理中位数. 其实 “包含一些颜色” 用斯坦纳树做也和普 ...

  7. LOJ#2977. 「THUSCH 2017」巧克力(斯坦纳树+随机化)

    题目 题目 做法 考虑部分数据(颜色较少)的: 二分中位数\(mid\),将\(v[i]=1000+(v[i]>mid)\) 具体二分操作:然后求出包含\(K\)种颜色的联通快最小的权值和,判断 ...

  8. 「THUSCH 2017」大魔法师 解题报告

    「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...

  9. LOJ 2288「THUWC 2017」大葱的神力

    LOJ 2288「THUWC 2017」大葱的神力 Link Solution 比较水的提交答案题了吧 第一个点爆搜 第二个点爆搜+剪枝,我的剪枝就是先算出 \(mx[i]\) 表示选取第 \(i \ ...

随机推荐

  1. Kestrel web server implementation in ASP.NET Core

    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore1x&view ...

  2. mybatis多对一

    产品和分类的多对一关系 多个产品属于一个分类 public class Product { private int id; private String name; private float pri ...

  3. oracle函数与存储方法

    oracle中的函数, 可以理解为java中的方法 有参数, 或者没有参数 通过return返回一个值 oracle存储过程跟函数唯一的区别, 存储过程不能通过return返回一个值 参数的类型, i ...

  4. httpclient模拟服务器请求

    // 创建默认的httpClient实例. CloseableHttpClient httpclient = HttpClients.createDefault(); // 创建httppost Ht ...

  5. 从0 开始手写一个 RPC 框架,轻松搞定!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 来源:juejin.im/post/5c4481a4f265da613438aec3 之前在 RPC框架底层到底什么原理得知 ...

  6. 使用redis来存储session,不同框架对session的命名规则是不一样的

    今天做了一个测试,在同一个云服务器上,搭建了两个server,其中一个是用laravel框架写的,另外一个使用原生php开发的,为了提高访问的速度,使用云服务器中的redis来存储session数据, ...

  7. ‘’‘安装PyMouse,个人日志'''

    管理员启动CMD 1.直接pip install pymouse,成功安装, 2.安装PyHook: https://www.lfd.uci.edu/~gohlke/pythonlibs/ (向下滑动 ...

  8. C Sleepy Kaguya

    链接:https://ac.nowcoder.com/acm/contest/338/C来源:牛客网 题目描述 Houraisan☆Kaguya is the princess who lives i ...

  9. js/jquery中什么时候用return,什么时候用return false

    根本的说 return 是函数的返回结果用, 如果你一个函数需要执行结果那就return 你需要的结果, 不需要结果就不用return而在jq中有些特殊的用法,比如$().each(function( ...

  10. PCA算法和实例

    PCA算法 算法步骤: 假设有m条n维数据. 1. 将原始数据按列组成n行m列矩阵X 2. 将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值 3. 求出协方差矩阵C=1/mXXT 4. ...