BZOJ3798: 特殊的质数(分段打表)】的更多相关文章

题意 题目链接 Sol 分块打表,非常好的思想. 对于这种求$[A, B]$区间内xxx的数的个数,然后$B$又不算是特别大的题,考虑分段打表 每个块的大小为$10^5$,打$3 * 10^3$个.然后块内的暴力查,块外的暴力算 /* */ #include<cstdio> #include<cstdlib> #include<ctime> const int N = 3e8; , base = 1e5; void check(int x) { ; i * i <…
题意: 求调和级数,但n很大啦.. 解析: 分段打表  每间隔50存储一个数,在计算时  只需要找到离输入的n最近的那个数 以它为起点 开始计算即可 emm...补充一下调和级数的运算公式   r为常数,r=0.57721566490153286060651209(r就是欧拉常数). 看一下这位的博客:https://www.cnblogs.com/weiyuan/p/5737273.html #include <iostream> #include <cstdio> #inclu…
显然只需要算出每个数比前面所有数大的期望然后全部加起来就好了,一个数的期望怎么算呢? 对于一个数我们需要考虑比它大的数,因为比它小的数放它前面放它后面都可以,但是比它大的数只能放它后面.考虑大于等于它的数有n-i+1个,排列有(n-i+1)!种,但是它必须放在所有数的前面,也就是合法的排列只有(n-i)!种,那么期望(n-i)!/(n-i+1)!=1/(n-i+1). 于是总的期望为 这是个调和级数,貌似可以用某个公式计算,但是这个时候可以祭出神器,分段打表!然后就AC了233 #include…
https://nanti.jisuanke.com/t/41355 思路 从fib循环节入手,\(O(1e7log(1e9))\),tle 因为只需要输出所有询问亦或后的结果,所以考虑答案的循环节,打表发现大于10w后的答案的循环节为2,\(O(1e5log(1e18))\) 不考虑循环节,第一眼看过去这道题需要O(1)询问,其实仔细一想可以多一些常数,考虑分段打表,1e18分成三段打表,每一段的表长都是1e6,然后每次询问最多\(O(2*矩阵相乘)\) #include<bits/stdc+…
题意 设 $$g_m(n)=\begin{cases}& g_m(i) = 0,     \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 \leq i \leq m\\& g_m(i) = i-1 + \frac{1}{i}\sum _{j=1}^i(g_m(j) + g_m(i-j)), \ \  i > m\\\end{cases}$$ 现给出 $n…
题意 设 $f(n)$ 为 $n=ab$ 的方案数,其中 $a,b$ 为无平方因子数. 例如,$f(6)=4$,因为 $6 = 1 \times 6 = 2 \times 3 = 3 \times 2 = 6 \times 1$, $f(12)=2$,因为 $12 = 2 \times 6 = 6 \times 2$. 求 $\displaystyle  \sum_{i=1}^nf(i)$,$n \leq 2e7$,共有 $T$ 组询问($T \leq 20$). 分析: 首先,$f(n)$ 可…
题目给的时间限制是3s,所以可以直接暴力来做,注意n的取值范围是1e8,如果开一个1e8的数组会RE.分段打表,可以每100个数记录一次,然后对每次询问先找到它所在的区间,然后在暴力往后找.(学到了~~) #include<bits/stdc++.h> using namespace std; ; double mp[N]; void inint(){ ; ;i<=;i++){ ans+=(double)1.0/i; ==) mp[i/]=ans; } } int main(){ ini…
题意: 传送门 已知\(F(n)=3F(n-1)+2F(n-2) \mod 998244353,F(0)=0,F(1)=1\),给出初始的\(n_1\)和询问次数\(q\),设每一次的答案\(a_i=F(n_i)\),而\(n_{i+1}=n_i\oplus(a_i*a_i)\),求\(a_1\oplus a_2\dots\oplus a_q\). 思路: 原式是一个二次常数递归式,我们可以求得它的通项为: \[F(n)=\frac{1}{\sqrt{17}}[(\frac{3+\sqrt{17…
[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这样的算…
块大小为10^5. #include<cstdio> using namespace std; const int table[] = {0, 4784, 8978, 12981, 16901, 20732, 24523, 28249, 31916, 35585, 39176, 42818, 46430, 49962, 53516, 57023, 60523, 64040, 67489, 70985, 74417, 77879, 81285, 84679, 88055, 91433, 9487…