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. es8(字符串,对象)

    es8(字符串,对象) 字符串补白: let str = "abc"; let a = str.padEnd(5); let b = str.padStart(5); let c ...

  2. HTML5 & CSS3 内容收集(1)

    1. HTML发展历史介绍 2. 浏览器支持 2.1 新增标签支持 在html5 中新增了很多的标签,其中包括8个新增语义结构标签.header, section, footer, aside, na ...

  3. 前端每日实战:96# 视频演示如何用纯 CSS 和 D3 创作一艘遨游太空的宇宙飞船

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oMqNmv 可交互视频 此视频是可 ...

  4. PAT B1014 福尔摩斯约会

    大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明白了,字条上奇 ...

  5. idea怎么创建python项目

    前言 python是一种功能强大和适用面很广的开发语言,在大数据应用和机器学习日益流行的年代,python凭借其简洁.易用和可扩展性获得很多用户的支持,近年来使用率高速增长.python环境下,集成了 ...

  6. phpshe xml注入

    *php商城系统 xml注入* **页面样式* *Xml原理参考:* https://www.cnblogs.com/20175211lyz/p/11413335.html *漏洞函数simplexm ...

  7. linux磁盘之lsblk命令

    lsblk命令可以显示很多跟磁盘相关分区.所属关系以及lvm的重要信息,所以这个命令最好掌握.lsblk命令默认情况下将以树状列出所有块设备,包括查看磁盘挂载信息.lsblk命令包含在util-lin ...

  8. NodeJs学习日报day7——简单中间件

    const express = require('express') const app = express() const mw = function(req, resp, next) { cons ...

  9. 2022-Aech安装(详细)

    官方wiki:https://wiki.archlinux.org/ 基础安装 一:制作安装介质 下载ISO镜像文件: https://archlinux.org/download/ # 官方下载网址 ...

  10. 一种O(n)时间复杂度的计数排序算法和Top N热词算法

    排序算法是研究非常广泛且超级经典的算法,主流排序算法的时间复杂度基本都在O(nlogn). 今天就介绍一种以hash表为基础的,时间复杂度能够达到O(n)的排序算法--计数排序: 同时基于它的思想,完 ...