description

\(T\)次询问,每次问\(L,L+1...R\)有多少种子集满足子集中乘积为完全平方数。

solution

50pt

首先双倍经验

通常的思路是:平方数即每个质因子指数为偶

奇偶性有关问题用异或!

用二进制(位数大,这里用bitset)每个质因子代表一位,表示该质因子指数的奇偶性。

就相当于问所有数对应bitset异或起来为0的方案数。

线性基中的个数为\(c\),方案数为(算空集)\(2^{n-c}\)。

首先不在线性基里面的个数(\(n-c\))为自由元个数,也可以理解为线性基外的无论怎么选,都能用线性基里的唯一构造出异或和为\(0\)。(线性基外的选了,再选线性基里面异或和等于它的几个)。

因此完成了问题的转化。

回到这道题,暴力的50pt可以过了。一次插入复杂度\(\pi^2(n)\)

当然可以优化,到\(\pi^2(\sqrt{n})\)

每个数质因数分解最多只会有一个\(>\sqrt{n}\)的质因子。

bitset和线性基只需要维护\(<=\sqrt{n}\)的质数即可。

对于\(>\sqrt{n}\)位的线性基,开一个unordered_map<质因子,对应bitset>。

挺妙的,感觉自己的大脑根本没有创造力!

100pt

50pt到100pt的桥梁只是一个结论:质因子\(n\)在\(r-l+1>\sqrt{n}\)且\([l,r]\)中存在数含有质因子\(n\),\(n\)一定会被加入线性基

证明?

这样根号分治一下

1.\(len<=\sqrt{10^7}\),暴力线性基

2.\(len>\sqrt{10^7}\),枚举每个质数\(p\)判断\([l,r]\)是否存在它的倍数(\(\left\lfloor\dfrac{r}{p}\right\rfloor \ne \left\lfloor\dfrac{l-1}{p}\right\rfloor\))

贺的 code:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int SN=455;
typedef bitset<SN> bit;
typedef long long ll;
const int Sq=3200;
const int mod=998244353;
const int N=1e7+1;
bool is_p[N];
int p0[N],p[N],ptot,tot0;
void _xxs() {
is_p[1]=1;
for(int i=2;i<N;i++) {
if(!is_p[i]) {
if(i<=Sq)p0[++tot0]=i;
p[++ptot]=i;
}
for(int j=1,x;j<=ptot&&(x=p[j]*i)<N;j++) {
is_p[x]=1;
if(i%p[j]==0)break;
}
}
// printf("ptot = %d tot0 = %d\n",ptot,tot0);
// for(int i=1;i<=10;i++)printf("%d ",p0[i]);puts("");
}
int S;
bit a[SN]; //线性基
unordered_map<int,bit> mp;
void Insert(int x) {
bit v;
for(int i=1;i<=tot0;i++) {
if(x%p0[i])continue;
int w=0;
while(x%p0[i]==0) {x/=p0[i];w^=1;}
if(w)v[i]=1;
}
if(x>1) {
if(!mp.count(x)) {mp[x]=v;S++;return;}
else {v^=mp[x];}
}
for(int i=tot0;i>=1;i--) {
if(!v[i])continue;
if(!a[i].any()) {a[i]=v;S++;return;}
v^=a[i];
}
}
ll ksm(ll x,ll y) {ll mul=1;for(;y;y>>=1,x=x*x%mod)if(y&1)mul=mul*x%mod;return mul;}
void Clear() {S=0;for(int i=tot0;i>=1;i--)a[i].reset();mp.clear();}
int main() {
_xxs();
int T;scanf("%d",&T);
while(T--) {
Clear();
int l,r;scanf("%d%d",&l,&r);
int len=r-l+1;
if(len<=7000) {
for(int i=l;i<=r;i++) Insert(i);
}
else {
for(int i=1;i<=ptot&&p[i]<=r;i++) {
if(r/p[i]!=(l-1)/p[i]) {S++;}
}
}
printf("%lld\n",ksm(2,len-S));
}
return 0;
}

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

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

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

  2. 【THUSC2017】杜老师

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

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

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

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

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

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

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

  6. THUSC 2017 D1T2 杜老师

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

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

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

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

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

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

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

随机推荐

  1. Codepen 每日精选(2018-4-16)

    按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以打开原始页面. 内容切换的交互效果https://codepen.io/jcoulterde... 报价卡片的交互效果ht ...

  2. javaweb之模糊查询

    模糊查询,主要通过sql语句来进行查询 一.dao层 加入模糊查询的方法 package dao; import java.sql.Connection; import java.sql.Prepar ...

  3. add jars、add external jars、add library、add class folder的区别

    add external jars = 增加工程外部的包add jars = 增加工程内包add library = 增加一个库add class folder = 增加一个类文件夹add jar是表 ...

  4. ELK日志保留7天-索引生命周期策略

    一.简介 ELK日志我们一般都是按天存储,例如索引名为"kafkalog-2022-04-05",因为日志量所占的存储是非常大的,我们不能一直保存,而是要定期清理旧的,这里就以保留 ...

  5. Linux利用crontab创建计划任务详解

    crontab 周期性计划任务 cron是Linux下的定时执行工具,可以在无需人工干预的情况下运行作业. 当需要周期性地重复执行任务时可以使用cron服务:该服务每分钟检查一次,并执行符合条件的任务 ...

  6. spatialite-tools 安装

    spatialite-tools 安装 官网 https://www.gaia-gis.it/fossil/spatialite-tools/index 下载地址 https://www.gaia-g ...

  7. 论文解读(S^3-CL)《Structural and Semantic Contrastive Learning for Self-supervised Node Representation Learning》

    论文信息 论文标题:Structural and Semantic Contrastive Learning for Self-supervised Node Representation Learn ...

  8. Python Requests 速通爆肝、这么牛逼的库你还不会用吗?

    上网原理 爬虫原理 Get.Post Requests 介绍 安装 常用方法 Http协议 开发者工具网络界面 Response对象 下载保存一张图片.一首音乐 添加Headers发送请求 判断HTT ...

  9. Java学习day24

    今天学习了IP地址.端口以及TCP/UDP通信协议 网络连接与过去的信件类似,需要知道对方的地址才能寄出去,在计算机网络中,我们的地址就是IP以及端口号 IP能用来唯一定位一台联网的计算机 本机的IP ...

  10. 推荐一个我写的Python库——PyNAS

    介绍 PyNAS是一个以Python的Updog的库为基础,制作而来的库 安装 pip安装(推荐) pip install PyNAS 源码安装(推荐) Github: git clone https ...