BZOJ 3798 分块打表】的更多相关文章

思路: 这题思路真是奇妙 先跑个暴力 每隔1e5打个表 块内暴力 打表程序: (开O3 15秒就跑完了) //By SiriusRen #include <bits/stdc++.h> using namespace std; ; bitset<N+>vis; ],sum[N+],s[]; int main(){ ;i<=N;i++){ if(!vis[i])prime[++tot]=i; ;i*prime[j]<=N&&j<=tot;j++){…
题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij}\frac{p - 1}{p}\] 而 \[ \begin{aligned} \varphi(i)\varphi(j) &= i\prod\limits_{p | i}\frac{p - 1}{p} j \prod\limits_{p | j}\frac{p - 1}{p} \\ \varphi(i…
题目链接 掌握了分块打表法了.原来以前一直想错了... 块的大小\(size=\sqrt n\),每隔\(size\)个数打一个表,还要在\(0\text{~}size-1\)每个数打一个表. 然后就可以做到\(O(1)\)查询了. 比如要求\(A^{n}\),只需要算出\(biao[n/size]*pow[n\mod size]\)就好了. 然后我是看题解用了通项公式..事实上套个矩阵也没有影响. #include <cstdio> #include <cmath> #defin…
[题目描述] Description 神犇最近闲来无事,于是就思考哲学,研究数字之美.在神犇看来,如果一个数的各位能够被分成两个集合,而且这两个集合里的数的和相等,那么这个数就是优美的(具体原因就只有神犇才知道了).现在神犇在思考另一个问题,在区间[a,b]中有多少个数是优美的?这个问题对于神犇来说很简单,相信对于你来说也不难. Input 输入只有一行,包含两个整数a和b. Output 输出只有一行,包含一个整数,代表区间[a,b]中优美的数的个数. Sample Input 1 11 Sa…
验证一个数是不是优美的:设数位之和为sum,若sum mod 2 != 0,则不优美.否则考虑枚举这个数的每一位,将之前所有位任意相加产生的所有 数字和 和 当前位 的和塞到集合里,最终判断集合中是否存在sum/2即可,若暴力,复杂度是1+2+4+...,无法承受,所以可以压位. 然后对10^9分块,暴力处理每个块内的答案,然后打个表,对零散的部分暴力即可. #include<cstdio> using namespace std; const int table[]={0,376413,83…
/* 打不了那么大的表,所以只记录分块的信息即可 */ #include<bits/stdc++.h> using namespace std; #define maxn 1000005 double arr[maxn]; void init(){ arr[]=; ; ;i<maxn*;i++){ tmp=tmp+1.0/i; ==)arr[i/]=tmp; } } int main(){ init(); ; cin>>T; while(T--){ cin>>n;…
[BZOJ3798]特殊的质数 Description 求[A,B]之间的质数个数,并且满足X=Q^2+P^2,P,Q是正整数. Input 第一行输入A,B Output 输出有多少组P,Q满足条件 Sample Input 6 66 Sample Output 7 HINT 1<=A<=B<=3*10^8 题解:还有什么比表打错了更让人欲哭无泪的~ 注意一下几点: 1.分块不能太小,10^5很稳,再小有可能装不下了 2.2=1*1+1*1,也算~ 3.不要把x=i*i+0*0这样的算…
题目 对于任意一个至少两位的正整数n,按如下方式定义magic(n):将n按十进制顺序写下来,依次对相邻两个数写下差的绝对值.这样,得到了一个新数,去掉前导0,则定义为magic(n).若n为一位数,则magic(n)=n. 例如:magic(5913)=482,magic(1198)=081=81,magic(666)=00=0. 对任意一个数n,序列n,magic(n),magic(magic(n)),-迟早会变成一个一位数.最后的这个值称为数n的magic指纹. 例如,对于n=5913,我…
正题 题目链接:https://www.luogu.com.cn/problem/P3793 题目大意 给出\(n\)个数字的一个序列\(m\)次询问区间最大值 保证数据随机 \(1\leq n,m\leq 2\times 10^7\) 解题思路 使用\(ST\)表可以做到\(O(1)\)询问,但是预处理的时空复杂度都是\(O(n\log n)\),且自带大常数导致过不了. 如何加快预处理的时间,(因为是lxl的题目所以)考虑使用分块.每次询问可以分为整块的部分和不是整块的零散部分. 去掉没有跨…
大题思路就是分块,将n个数分成sqrt(n)个块,然后 处理出一个w数组,w[i,j]代表第i个块到第j个块的答案 那么对于每组询问l,r如果l,r在同一个块中,直接暴力做就行了 如果不在同一个块中,l,r区间中整块的部分可以直接由w数组得到答案 然后多出来的部分暴力处理下出现次数,然后再预处理一个b数组,代表没 个数出现的位置,且每个数都连续,那么我们可以二分的找出在多余部分出现的 每个数在整区间内出现多少次,然后和多余部分出现的累加,判断奇偶更新答案 看了lyd的题解,写的挺好(其实这个题就…