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 \ ...
随机推荐
- CodeIgniter 技巧 - 通过 Composer 安装 CodeIgniter 框架并安装依赖包
PHP 项目中,通过 Composer 来管理各种依赖包,类似 Java 中的 Maven,或 Node 中的 npm.CodeIgniter 框架要想通过 Composer 自动加载包也很简单,步骤 ...
- Oracle客户端和服务端的区别
转载:https://blog.csdn.net/qq_22558507/article/details/75220224 随着Oracle技术领域应用越来越广泛,现在就关于oracle客户端配置极其 ...
- 基于vux的Vue路由切换动画
const history = window.sessionStorage history.clear() let historyCount = history.getItem('count') * ...
- Netty之大名鼎鼎的EventLoop
EventLoopGroup 与Reactor: 前面的章节中我们已经知道了,一个Netty 程序启动时,至少要指定一个EventLoopGroup(如果使用到的是NIO,通常是指NioEventLo ...
- sqlserver关于时间的一些语句
/* 去掉时间的时分秒 */ CONVERT(CHAR(10),operate_time,120) /* 所有的天数增加一天 */ DATEADD(day,1,t.operate_time) /* 返 ...
- [BZOJ 2653] middle(可持久化线段树+二分答案)
[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...
- [洛谷P1552] [APIO2012]派遣(左偏树)
这道题是我做的左偏树的入门题,奈何还是看了zsy大佬的题解才能过,唉,我太弱了. 左偏树总结 Part 1 理解题目 很显然,通过管理关系的不断连边,最后连出来的肯定是一棵树,那么不难得出,当一个忍者 ...
- react native 之 Android studio
https\://services.gradle.org/distributions/gradle-4.4-all.zip 下载失败 https://blog.csdn.net/u013132758/ ...
- iOS crash log 解析
iOS开发中,经常遇到App在开发及测试时不会有问题,但是装在别人的设备中会出现各种不定时的莫名的 crash,因为iOS设备会保存应用的大部分的 crash Log,所以可以通过 crash Log ...
- REVOKE - 删除访问权限
SYNOPSIS REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRI ...