题目: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. JAVA File的创建及相对路径绝对路径

    http://blog.sina.com.cn/s/blog_9386f17b0100w2vv.html JAVA File的创建及相对路径绝对路径 (2011-12-09 08:27:56) 转载▼ ...

  2. Centos安装GD库

    tar zxvf ncurses-5.6.tar.gz 进入目录 cd ncurses-5.6 生成 makefile文件,再进一步编译 ./configure --prefix=/usr --wit ...

  3. hdu6228Tree

    Problem Description Consider a un-rooted tree T which is not the biological significance of tree or ...

  4. 最长连续公共子序列(LCS)与最长递增公共子序列(LIS)

    最长公共子序列(不连续) 实际问题中也有比较多的应用,比如,论文查重这种,就是很实际的一个使用方面. 这个应该是最常见的一种了,不再赘述,直接按照转移方程来进行: 按最普通的方式就是,直接构造二维矩阵 ...

  5. 统计Git

    公司需求统计Mos代码行数 方法一:用git #!/bin/bash read -p "输入你要统计mos的分支:" branch Mos_Project=(uusafe-prod ...

  6. .net Datatable

    1. ROW remove vs delete datatable dt = new datatable() //fill 5 records for each row as datarow in d ...

  7. window下 nginx 80端口被占用

    问题:启动nginx没有反应,查看日志提示 bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in ...

  8. 分析abex'crackme#1

    测试文件下载:https://www.wocloud.com.cn/webclient/share/sindex.action?id=i9K_Br6TgE7Kf_YTF04yHmKcRy5TUdZ8U ...

  9. Python之反向迭代

    需求:得到反方向迭代一个序列解决:使用内置的 reversed() 函数 a = [1, 2, 3, 4] for x in reversed(a): print(x) # 4 3 2 1 反向迭代仅 ...

  10. JavaScript中的map()函数

    概述Array.map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值,同时不会改变原来的数组. 用法 Array.map(callback); 示例 //简单数组 const ...