[THUSCH2017] 杜老师
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] 杜老师的更多相关文章
- 洛谷 P7451 - [THUSCH2017] 杜老师(线性基+根分+结论题)
题面传送门 看到乘积为平方数我们可以很自然地想到这道题,具体来说,我们对 \(1\sim 10^7\) 中所有质因子标号 \(1,2,\cdots,\pi(10^7)\),对于 \(x\in[l,r] ...
- 【THUSC2017】杜老师
题目描述 杜老师可是要打+∞年World Final的男人,虽然规则不允许,但是可以改啊! 但是今年WF跟THUSC的时间这么近,所以他造了一个idea就扔下不管了…… 给定L,R,求从L到R的这R− ...
- 【THUSC2017】【LOJ2978】杜老师 高斯消元
题目大意 给你 \(l,r\),求从 \(l\) 到 \(r\) 这 \(r-l+1\) 个数中能选出多少个不同的子集,满足子集中所有的数的乘积是一个完全平方数. 对 \(998244353\) 取模 ...
- LOJ #2978「THUSCH 2017」杜老师
听说LOJ传了THUSC题赶紧上去看一波 随便点了一题都不会做想了好久才会写暴力爆了一发过了... LOJ #2978 题意 $ T$次询问,每次询问$ L,R$,问有多少种选取区间中数的方案使得选出 ...
- 洛谷 P4948 拉格朗日多项式插值(杜老师板子)
https://www.luogu.org/problemnew/show/P4948 这篇博客主要目的是存一下的dls的神奇板子,本来应该是推公式或者二分做的 但是dls的插值板子直接写好了这个特殊 ...
- THUSC 2017 D1T2 杜老师
这是个非常有趣的数学题啦... 其实大概推一推式子就能得到一个信息,就是答案一定是$2$的整数次幂,并且其实答案就是$2^{R-L+1-sum}$,其中$sum$表示有多少个数不能用$L-i-1$的数 ...
- loj#2978. 「THUSCH 2017」杜老师(乱搞)
题面 传送门 题解 感谢yx巨巨 如果一个数是完全平方数,那么它的所有质因子个数都是偶数 我们把每一个数分别维护它的每一个质因子的奇偶性,那么就是要我们选出若干个数使得所有质因子的个数为偶数.如果用线 ...
- [THUSC2017]杜老师:bitset+线性基
算法一(50pts) 分析 有一个很显然的暴力做法,对于区间内的每个数开个bitset,然后暴力分解质因数.如果对于一个数,它的一个质因子的指数是奇数,那么就把bitset的对应位设成\(1\).答案 ...
- LOJ 2978 「THUSCH 2017」杜老师——bitset+线性基+结论
题目:https://loj.ac/problem/2978 题解:https://www.cnblogs.com/Paul-Guderian/p/10248782.html 第 i 个数的 bits ...
随机推荐
- JavaScript 中 append()、prepend()、after()、before() 的区别
内容 append().prepend().after().before() 的区别 jQuery 操作 DOM 之添加节点 方法名 作用 $(selector).append() 指定元素内部添加, ...
- jdbc连接数据库以及简单实现(普通JDBC方法实现和连接池方式实现)
@ 目录 总结内容 1. 基本概念 jdbc的概念 2. 数据库连接 数据库的连接 DAO层思想 重构设计 3. 事务 概念 事务的ACID属性 事务的操作 4. 连接池 为什么要使用连接池 连接池分 ...
- Java在方法中定义可变参数类型
学习目标: 掌握可变参数的应用 学习内容: 1.定义 在方法中传递数组有一种更简单的方式--方法的可变参数,其本质是一个语法糖,目的是让开发者写代码更简单. 2.语法 [修饰符] 返回值类型 方法名称 ...
- spring总览
Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...
- 初识react中高阶组件
高阶组件并不是一个组件,而是一个函数 这个函数返回值是一个组件,并且接受一个组件做为参数:并且返回一个新组件: function HighOC(WrapComponent){ //定义一个高阶组件 , ...
- [ Skill ] 为什么 Lisp 语言如此先进
https://www.cnblogs.com/yeungchie/ 网上看到一个应该是 2002 年的文章 译文转自:为什么Lisp语言如此先进?(译文) - 阮一峰的网络日志 原文地址:Reven ...
- Sql语言-操作表
2. 操作表 1. C(Create):创建 1. 语法: create table 表名( 列名1 数据类型1, 列名2 数据类型2, .... 列名n 数据类型n ); * 注意:最后一列,不需要 ...
- 基于 Redis 分布式锁
1.主流分布式锁实现方案 基于数据库实现分布式锁 基于缓存(redis 等) 基于 Zookeeper 2.根据实现方式分类 : 类 CAS 自旋式分布式锁:询问的方式,类似 java 并发编程中的线 ...
- jsp第七周作业
1.p78-p79的例4-9 <%@ page language="java" import="java.util.*" pageEncoding=&qu ...
- JS的URIencode方式
BEGIN; 对需要传递的URL参数进行URLencode编码 刚开始浪费了很多时间都没搞出来,不知道怎么用.后面google到了不少解决方案,最终解决.转载下面内容: js对文字进行编码涉及3个函数 ...