[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 ...
随机推荐
- 【uniapp 开发】手绘签名组件
代码如下: <template> <view class="content"> <button type="primary" @t ...
- 子线程中如何修改ui界面
1.Android进程 一个应用程序被启动时,系统默认创建执行一个叫做"main"的线程.这个线程也是你的应用与界面工具包(android.widget和android.view包 ...
- 牛客网-剑指Offer 二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- ps让图片背景透明
效果图: jpg=>png,背景透明 步骤: 1.选择橡皮工具的第三个 魔术橡皮 保存为png, 按住Ctrl+alt+shift+s 保存:
- WebSocket学习笔记
参考文章链接:http://www.ruanyifeng.com/blog/2017/05/websocket.html 简单示例:https://www.yiibai.com/websocket/p ...
- 接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理)
接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理) 1.抽象类 以下说辞可能不太准确,但是会让你醍醐灌顶 抽象类是把一些具有共同属性(包括行为)的东西抽象出来,比如: 小狗有身高,体重,颜 ...
- ajax - 终结篇jsonp,防抖节流
今天是我们最后一天ajax的学习,这次学完总可以去vue了吧,我不信还有什么拦路石,先不说其他的先看看今天的内容. 1. 首先是同源策略,什么叫做同源? 如果两个页面的协议.域名.端口都相同的话,我们 ...
- 微信小程序--设置和获取剪切板内容
设置 wx.setClipboardData // 复制功能 获取 wx.getClipboardData // 粘贴功能 let _this = this wx.setClipbo ...
- SIP信令跟踪工具HOMER
概述 HOMER是一款100%开源的针对SIP/VOIP/RTC的抓包工具和监控工具. HOMER是一款强大的.运营商级.可扩展的数据包和事件捕获系统,是基于HEP/EEP协议的VoIP/RTC监控应 ...
- CUDA02 - 访存优化和Unified Memory
CUDA02 - 的内存调度与优化 前面一篇(传送门)简单介绍了CUDA的底层架构和一些线程调度方面的问题,但这只是整个CUDA的第一步,下一个问题在于数据的访存:包括数据以何种形式在CPU/GPU之 ...