假设所有素数从小到大依次为$p_{1},p_{2},...,p_{k}$,我们将$x$转换为一个$k$位的二进制数,其中从低到高第$i$位为1当且仅当其$p_{i}$的幂次为奇数

不难发现以下两个性质:

1.假设$x$和$y$转换得到的二进制数分别为$x'$和$y'$,则$xy$转换后二进制数为$x'\oplus y'$

2.$x$为完全平方数当且仅当$x$转换得到的二进制为0

由此,实际上也就是统计$[l,r]$这些数所转换的二进制数有多少个子集结果为0

考虑线性基,当构造得到线性基后,根据线性基有以下性质:对于线性基外任取若干个数,线性基内恰存在一种取法使得最终异或结果为0

首先,由于线性基外的每一个数都能与线性基内的若干个数异或为0,将所有数异或起来也就得到了一种方案,同时若有两种方案,即线性基内存在若干个数异或为0,也矛盾

由此,我们得到了方案数就是$2^{r-l+1-线性基内数的个数}$

暴力求线性基复杂度是$o(\frac{r-l+1}{\omega}\pi(r)^{2})$(其中$\pi(r)$表示小于等于$r$的素数个数),需要优化:

由于大于$\sqrt{r}$的素因子至多只有1个,因此可以手动模拟这一次操作,具体来说遍历时在第一次出现某个大素数(大于$\sqrt{r}$的素数)时记录该数,并令之后出现含有此因子的都异或该数

这样做的复杂度降为$o(\frac{r-l+1}{\omega}\pi(\sqrt{r})^{2})$,但还是无法通过

进一步的,暴力验证可以发现在$r-l\ge 6661$时,线性基一定会满,即线性基内数的个数即$[l,r]$中所有出现的素因子个数,这个可以枚举素数来计算

最终,复杂度即$o(t(\pi(r)+\frac{6661\pi(\sqrt{r})^{2}}{\omega}))$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 10000005
4 #define mod 998244353
5 #define L 6661
6 #define P 446
7 bitset<P>g,bt[L],f[P];
8 int t,l,r,mi[N],vis[N],p[N],lst[N];
9 int main(){
10 mi[0]=1;
11 for(int i=1;i<N;i++)mi[i]=2*mi[i-1]%mod;
12 vis[1]=1;
13 for(int i=2;i<N;i++){
14 if (!vis[i])p[++p[0]]=i;
15 for(int j=1;(j<=p[0])&&(i*p[j]<N);j++){
16 vis[i*p[j]]=1;
17 if (i%p[j]==0)break;
18 }
19 }
20 scanf("%d",&t);
21 while (t--){
22 scanf("%d%d",&l,&r);
23 int ans=r-l+1;
24 if (r-l>=L){
25 for(int i=1;p[i]<=r;i++)
26 if (r/p[i]>(l-1)/p[i])ans--;
27 }
28 else{
29 for(int i=0;i<P;i++)f[i].reset();
30 for(int i=l;i<=r;i++){
31 int k=i;
32 for(int j=1;j<=P;j++){
33 int tot=0;
34 while (k%p[j]==0){
35 tot^=1;
36 k/=p[j];
37 }
38 bt[i-l][j-1]=tot;
39 }
40 g=bt[i-l];
41 if (k>1){
42 if ((lst[k]<l)||(lst[k]>=i))lst[k]=0;
43 if (!lst[k]){
44 lst[k]=i;
45 ans--;
46 }
47 g^=bt[lst[k]-l];
48 }
49 for(int j=0;j<P;j++){
50 if (!g.any())break;
51 if (g[j]){
52 if (!f[j].any()){
53 f[j]=g;
54 ans--;
55 }
56 g^=f[j];
57 }
58 }
59 }
60 }
61 printf("%d\n",mi[ans]);
62 }
63 return 0;
64 }

[loj2978]杜老师的更多相关文章

  1. 【THUSC2017】杜老师

    题目描述 杜老师可是要打+∞年World Final的男人,虽然规则不允许,但是可以改啊! 但是今年WF跟THUSC的时间这么近,所以他造了一个idea就扔下不管了…… 给定L,R,求从L到R的这R− ...

  2. 【THUSC2017】【LOJ2978】杜老师 高斯消元

    题目大意 给你 \(l,r\),求从 \(l\) 到 \(r\) 这 \(r-l+1\) 个数中能选出多少个不同的子集,满足子集中所有的数的乘积是一个完全平方数. 对 \(998244353\) 取模 ...

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

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

  4. 洛谷 P4948 拉格朗日多项式插值(杜老师板子)

    https://www.luogu.org/problemnew/show/P4948 这篇博客主要目的是存一下的dls的神奇板子,本来应该是推公式或者二分做的 但是dls的插值板子直接写好了这个特殊 ...

  5. THUSC 2017 D1T2 杜老师

    这是个非常有趣的数学题啦... 其实大概推一推式子就能得到一个信息,就是答案一定是$2$的整数次幂,并且其实答案就是$2^{R-L+1-sum}$,其中$sum$表示有多少个数不能用$L-i-1$的数 ...

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

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

  7. [THUSC2017]杜老师:bitset+线性基

    算法一(50pts) 分析 有一个很显然的暴力做法,对于区间内的每个数开个bitset,然后暴力分解质因数.如果对于一个数,它的一个质因子的指数是奇数,那么就把bitset的对应位设成\(1\).答案 ...

  8. LOJ 2978 「THUSCH 2017」杜老师——bitset+线性基+结论

    题目:https://loj.ac/problem/2978 题解:https://www.cnblogs.com/Paul-Guderian/p/10248782.html 第 i 个数的 bits ...

  9. 洛谷 P7451 - [THUSCH2017] 杜老师(线性基+根分+结论题)

    题面传送门 看到乘积为平方数我们可以很自然地想到这道题,具体来说,我们对 \(1\sim 10^7\) 中所有质因子标号 \(1,2,\cdots,\pi(10^7)\),对于 \(x\in[l,r] ...

随机推荐

  1. Java爬虫系列四:使用selenium-java爬取js异步请求的数据

    在之前的系列文章中介绍了如何使用httpclient抓取页面html以及如何用jsoup分析html源文件内容得到我们想要的数据,但是有时候通过这两种方式不能正常抓取到我们想要的数据,比如看如下例子. ...

  2. 2020.12.20-Codeforces Round #105补题

    B - Escape The princess is going to escape the dragon's cave, and she needs to plan it carefully. Th ...

  3. javascript高级程序设计第三版书摘

    在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...

  4. 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...

  5. elasticsearch的索引重建

    我们知道es在字段的mapping建立后就不可再次修改mapping的值.在我们实际的情况下有些时候就是需要修改mapping的值,解决方案就是重新构建索引数据. 方式一 : 使用索引别名,创建另外一 ...

  6. 洛谷 P3209 [HNOI2010] 平面图判定

    链接: P3209 题意: 给出 \(T\) 张无向图 \((T\leq100)\),并给出它对应的哈密顿回路,判断每张图是否是平面图. 分析: 平面图判定问题貌似是有线性做法的,这里给出链接,不是本 ...

  7. K8S_Kubernetes

    Google创造, K8S,是基于容器的集群管理平台, K8S集群   应用场景 微服务   这个集群主要包括两个部分 一个Master节点(主节点) 一群Node节点(计算节点)   Master节 ...

  8. OAuth 2.0 的探险之旅

    前言 OAuth 2.0 全称是 Open Authorization 2.0, 是用于授权(authorization)的行业标准协议. OAuth 2.0 专注于客户端开发人员的简单性,同时为 W ...

  9. cloudstack部署

    参考文档 https://blog.csdn.net/u012124304/article/details/80960504#Mysql_37 cloudstack的rpm包下载地址 http://d ...

  10. 修改 oracle 数据库的 sys 账号密码,ERROR at line 1: ORA-01034: ORACLE not available

    挺久没有登录的 oracle 数据库,因为公司要求加固密码,登录后修改失败 1.启动数据库的同时启动控制文件.数据文件,提示:cannot mount database in EXCLUSIVE mo ...