LOJ 2978 「THUSCH 2017」杜老师——bitset+线性基+结论
题目: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+线性基+结论的更多相关文章
- LOJ #2978「THUSCH 2017」杜老师
听说LOJ传了THUSC题赶紧上去看一波 随便点了一题都不会做想了好久才会写暴力爆了一发过了... LOJ #2978 题意 $ T$次询问,每次询问$ L,R$,问有多少种选取区间中数的方案使得选出 ...
- loj#2978. 「THUSCH 2017」杜老师(乱搞)
题面 传送门 题解 感谢yx巨巨 如果一个数是完全平方数,那么它的所有质因子个数都是偶数 我们把每一个数分别维护它的每一个质因子的奇偶性,那么就是要我们选出若干个数使得所有质因子的个数为偶数.如果用线 ...
- @loj - 2977@ 「THUSCH 2017」巧克力
目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...
- LOJ 2980 「THUSCH 2017」大魔法师——线段树
题目:https://loj.ac/problem/2980 线段树维护矩阵. 然后是 30 分.似乎是被卡常了?…… #include<cstdio> #include<cstri ...
- LOJ 2979 「THUSCH 2017」换桌——多路增广费用流
题目:https://loj.ac/problem/2979 原来的思路: 优化连边.一看就是同一个桌子相邻座位之间连边.相邻桌子对应座位之间连边. 每个座位向它所属的桌子连边.然后每个人建一个点,向 ...
- LOJ 2997 「THUSCH 2017」巧克力——思路+随机化+斯坦纳树
题目:https://loj.ac/problem/2977 想到斯坦纳树.但以为只能做 “包含一些点” 而不是 “包含一些颜色” .而且不太会处理中位数. 其实 “包含一些颜色” 用斯坦纳树做也和普 ...
- LOJ#2977. 「THUSCH 2017」巧克力(斯坦纳树+随机化)
题目 题目 做法 考虑部分数据(颜色较少)的: 二分中位数\(mid\),将\(v[i]=1000+(v[i]>mid)\) 具体二分操作:然后求出包含\(K\)种颜色的联通快最小的权值和,判断 ...
- 「THUSCH 2017」大魔法师 解题报告
「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...
- LOJ 2288「THUWC 2017」大葱的神力
LOJ 2288「THUWC 2017」大葱的神力 Link Solution 比较水的提交答案题了吧 第一个点爆搜 第二个点爆搜+剪枝,我的剪枝就是先算出 \(mx[i]\) 表示选取第 \(i \ ...
随机推荐
- ngrinder压力测试
文章目录 另一篇 部署demo 写脚本 压力测试 目标主机监控 可能报错 总结: 另一篇 https://blog.csdn.net/dataiyangu/article/details/888518 ...
- mooc-IDEA 应用快捷键自动创建测试类--010
十六.IntelliJ IDEA -应用快捷键自动创建测试类 Step1:在类或接口上,按ctrl+shift+t 选择Create New Test... 则在相应测试包下.创建该测试类. 测试类:
- [Python3] 022 面向对象 第二弹
目录 6. 面向对象的三大特性 6.1 封装 6.1.1 私有 private 6.1.2 受保护 protected 6.1.3 公开 public 6.2 继承 6.2.1 继承的概念与作用 6. ...
- 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanCreationException: Error creating bean with name
HTTP Status 500 - Servlet.init() for servlet mybatis threw exception type Exception report message S ...
- spring-第十四篇之资源访问Resource接口
1.Resource接口提供的主要方法 1>getInputStream():定位并打开资源,返回资源对应的输入流.每次调用都返回新的输入流.调用者必须负责关闭输入流. 2>isOpen( ...
- Angular2+之模态框-使用ngx-bootstrap包中的模态框组件实现
模态框是项目中经常会用到的一个公共功能,通常会被用左提示框或者扩展选项框. 下面,我用一个小例子来简单展示实现模态框功能的过程: 1.为项目加包: ng add ngx-bootstrap 2.在xx ...
- grep命令用关系或查询多个字符串
bcmsh ps | grep -E 'port|ge2 ' bcmsh ps | grep 'port\|ge2 ' 我的目的是筛选出含有 ‘port’ 或者含有 ‘ge2 ’ 的行,上面的第一行参 ...
- 排序---快速排序及其切分函数Partition应用
快速排序 快速排序通过一个切分元素将数组分成两个子数组,左子数组小于等于切分元素,右子数组大于切分元素,将这两个子数组排序,也就是将整个数组排序了. 代码如下: public class Sort ...
- 【JAVA】 04-Java中的多线程
链接: 笔记目录:毕向东Java基础视频教程-笔记 GitHub库:JavaBXD33 目录: <> <> 内容待整理: 多线程引入 概述 多线程: 进程:正在执行中的程序,其 ...
- 给定中序和后序遍历,求前序序列(C++递归方式实现)
问题: 输入后序和中序,求中序遍历. 算法: void f2(string &pre,string in, string post) { ) //序列为空结束 return; ; //根节点 ...