题目: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. TensorFlow学习笔记3-从MNIST开始

    TensorFlow学习笔记3-从MNIST开始学习softmax 本笔记内容为"从MNIST学习softmax regression算法的实现". 注意:由于我学习机器学习及之前 ...

  2. Linux命令行基础操作

    目录 1.打开终端命令行 2.常用快捷键 2.1 tab键 2.2 Ctrl+c组合键 2.3 Ctrl+d组合键 2.4Ctrl+Shift+c组合键和Ctrl+Shift+v组合键 2.5图形界面 ...

  3. JsonView视图

    同一个对象,在不同的场景,返回不同的属性,如getUserById返回User对象包含password值,而getAllUsers返回User集合,不包含password值(通过接口查看显示,序列化的 ...

  4. 使用bootstrap制作网站导航

    除了制作选项卡和下拉菜单,bootstrap还能编写出美观的网站导航栏 一.仿知乎导航栏 <body> <nav class="navbar navbar-default ...

  5. java_第一年_JavaWeb(6)

    会话 会话:浏览器从打开一个进程访问服务器到该浏览器关闭,我们称之为一个会话: 在浏览器和服务器交互期间,会不可避免地产生一些数据,而为了为每个用户保存其对应的数据,可使用两种技术:Cookie和Se ...

  6. [Bzoj3223][Tyvj1729] 文艺平衡树(splay/无旋Treap)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3223 平衡树处理区间问题的入门题目,普通平衡树那道题在维护平衡树上是以每个数的值作为维护 ...

  7. H Kuangyeye and hamburgers

    链接:https://ac.nowcoder.com/acm/contest/338/H来源:牛客网 题目描述 Kuangyeye is a dalao of the ACM school team ...

  8. P5468 [NOI2019]回家路线

    传送门 看题目一眼斜率优化,然后写半天调不出来 结果错误的 $dfs$ 有 $95$ 分?暴力 $SPFA$ 就 $AC$ 了? 讲讲正解: 显然是斜率优化的式子: 先不考虑 $q_{s_k}$ 的贡 ...

  9. 75.Binary Tree Maximum Path Sum(二叉树的最大路径和)

    Level:   Hard 题目描述: Given a non-empty binary tree, find the maximum path sum. For this problem, a pa ...

  10. 1.ireport基本使用

    1. 2.