[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 ...
随机推荐
- vuex基础详解
vuex入门 安装 vuex为我们提供了两种使用方法 直接引入 vuex下载地址:https://unpkg.com/vuex@2.0.0 下载之后用< script >标签包裹引入即可 ...
- python实战----Todo清单续写
添加分页功能 第一步:是对视图函数的改写,通过查询数据库数据,进行分页显示 # 修改清单显示的视图函数 @app.route('/list/') @app.route('/list/<int:p ...
- PAT B1081 检查密码
题目描述: 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也有数字. 输入格式: ...
- PAT B1002写出这个数
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1. 输出格式: 在一行内输出 n 的 ...
- CSS简单样式练习(六)
运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- 微信小程序拖动列表功能
WXML部分 1 <view class="index"> 2 3 <!-- 数据展示区 --> 4 <scroll-view 5 class=&qu ...
- FastAPI(六十六)实战开发《在线课程学习系统》接口开发--用户注册接口开发
在前面我们分析了接口的设计,那么我们现在做接口的开发. 我们先去设计下pydantic用户参数的校验 from pydantic import BaseModel from typing import ...
- pycharm——import已存在的库居然失败!
问题 明明在cmd中可以import的库,放到pycharm中却找不到. 问题根源 找了一圈,最后得到这个结论. 因为pycharm默认就是这样的... 解决 打开设置,找到解释器 点击右边齿轮图标, ...
- springboot项目找不到符号问题以及模块聚合项目maven插件使用的相关问题
问题如图 更换maven,清空缓存重新导入依赖依然无效后 解决方法: 方式一:删除项目中.idea文件夹,重新打开项目,选中jdk版本 ,重新导入依赖即可. 最近又遇到找不到符号问题,本地运行没问题, ...
- centos和redhat的区别
CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linu ...