jzoj5683. 【GDSOI2018模拟4.22】Prime (Min_25筛+拉格朗日插值+主席树)
题面
\(n\leq 10^{12},k\leq 100\)
题解
一眼就是一个\(Min\_25\)筛+拉格朗日插值优化,然而打完之后交上去发现只有\(60\)分
神\(tm\)还要用主席树优化……
大概是这样,设\(g(n,j)\)表示\(1\)到\(n\)之间的所有满足\(i\)是质数或者\(i\)的最小质因子大于\(p_j\)的所有\(f(i)\)之和,我们根据递归地来求解\(g\),设一个阈值\(L=\sqrt{n}\),当\(n\leq L\)的时候,用主席树优化,能做到每一次查询只有\(O(\log\sqrt{n})\)
发现这玩意儿和杜教筛很像,所以就当它的复杂度是\(O(n^{\frac{2}{3}})\)好了……我实在算不来……
然而交上去还是\(T\)……你这才发现这题时间和空间都卡得要命……那么只好卡常了……
1.阈值\(L\)开到\(2100000\)左右实测最优,尽量不要开小,会需要多算很多东西,开大的话空间又会不够
2.空间卡着开,不需要多开的就别开了
3.在拉格朗日差值计算\(\sum_{i=2}^mf(i)\)的前缀和的时候,因为涉及到的所有\(m\)只有\(O(\sqrt{n})\)个,对于小于\(L\)的可以打表预处理,对于大于\(L\)的\(m\)我们可以计算之后存起来。设\(x=\left\lfloor\frac{n}{m}\right\rfloor\),容易发现这里的\(x\leq \sqrt{n}\),想想整除分块,发现这里的\(x\)就是最大的满足\(\left\lfloor\frac{n}{x}\right\rfloor=m\)的数,那么每一个\(x\)都和\(m\)是一一对应的,我们就可以把它给存起来
4.还是过不去,吸氧好了
//minamoto
#include<cstdio>
#define R register
#define ll long long
#pragma GCC optimize(3)
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
const int N=2.1e6+5,M=N*18,P=1e9+7;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
int p[N/3],sp[N/3],vis[N],f[N],sum[N],mnp[N],ssr[N],ss[N];
int rt[N],ls[M],rs[M],s[M],fs[109],inv[109];
int k,tot,m,sqr,cnt;ll n;
void ins(int &p,int q,int l,int r,int x,int v){
s[p=++cnt]=add(s[q],v);if(l==r)return;
int mid=(l+r)>>1;
x<=mid?(rs[p]=rs[q],ins(ls[p],ls[q],l,mid,x,v)):(ls[p]=ls[q],ins(rs[p],rs[q],mid+1,r,x,v));
}
int query(int p,int l,int r,int x){
if(!p||l==r)return s[p];
int mid=(l+r)>>1;
return x<=mid?add(s[rs[p]],query(ls[p],l,mid,x)):query(rs[p],mid+1,r,x);
}
void init(int n){
f[0]=sum[0]=P-1;
fp(i,2,n){
if(!vis[i])p[++tot]=i,ssr[i]=f[i]=ksm(i,k),sp[tot]=add(sp[tot-1],f[i]);
for(R int j=1;j<=tot&&1ll*i*p[j]<=n;++j){
vis[i*p[j]]=1,f[i*p[j]]=mul(f[i],f[p[j]]),mnp[i*p[j]]=j;
if(i%p[j]==0)break;
}
}
fp(i,2,n){
sum[i]=add(sum[i-1],f[i]),ssr[i]=add(ssr[i-1],ssr[i]);
if(rt[i]=rt[i-1],mnp[i])ins(rt[i],rt[i-1],1,tot,mnp[i],f[i]);
}
inv[0]=inv[1]=1;fp(i,2,k+5)inv[i]=1ll*(P-P/i)*inv[P%i]%P;
}
int Lar(ll g,int n){
int k=g%P;
if(k<=sqr)return sum[k];
if(ss[::n/g])return ss[::n/g];
int res=0,tmp=1,ty=(n&1)?P-1:1;
fp(i,1,n)tmp=mul(tmp,inv[i]);
fs[n+1]=1;fd(i,n,0)fs[i]=mul(fs[i+1],k-i);
fp(i,0,n){
res=add(res,1ll*tmp*ty%P*sum[i]%P*fs[i+1]%P),
tmp=1ll*tmp*(k-i)%P*(n-i)%P*inv[i+1]%P,
ty=P-ty;
}return ss[::n/g]=res;
}
int G(ll n,int m){
if(n<=sqr&&1ll*p[m+1]*p[m+1]>n)return ssr[n];
if(n<=sqr)return add(query(rt[n],1,tot,m+1),ssr[n]);
if(!m)return Lar(n,k+1);
while(1ll*p[m]*p[m]>n)--m;
int res=Lar(n,k+1);
while(m)res=dec(res,1ll*f[p[m]]*dec(G(n/p[m],m-1),sp[m-1])%P),--m;
return res;
}
int main(){
// freopen("testdata.in","r",stdin);
freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
scanf("%lld%d",&n,&k),sqr=2.1e6,init(sqr);
printf("%d\n",G(n,tot-1));
return 0;
}
jzoj5683. 【GDSOI2018模拟4.22】Prime (Min_25筛+拉格朗日插值+主席树)的更多相关文章
- uoj#448. 【集训队作业2018】人类的本质(Min_25筛+拉格朗日插值)
题面 传送门 题解 肝了整整一天--膜拜yww和cx巨巨--(虽然它们的题解里我就没看懂几个字) 请备好草稿纸和笔,这种题目就是需要耐心推倒 题目所求是这么一个东西 \[ \begin{aligned ...
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- LOJ #6207 - 米缇(杜教筛+拉格朗日插值)
LOJ 题面传送门 首先将 \(\sigma_k(ij)\) 展开: \[\sigma_k(ij)=\sum\limits_{x\mid i}\sum\limits_{y\mid j}[x\perp ...
- 【模拟8.03】数颜色(vector//主席树)
才知道vector在插入值后是可以直接修改的... 那就很简单了 用vector的lowerbound这样的二分操作,提前储存每个颜色的位置 发现交换相对位置不变 关于vector的lowerboun ...
- min_25筛
min_25筛 用来干啥? 考虑一个积性函数\(F(x)\),用来快速计算前缀和\[\sum_{i=1}^nF(i)\] 当然,这个积性函数要满足\(F(x),x\in Prime\)可以用多项式表示 ...
- LOJ6053 简单的函数 【Min_25筛】【埃拉托斯特尼筛】
先定义几个符号: []:若方括号内为一个值,则向下取整,否则为布尔判断 集合P:素数集合. 题目分析: 题目是一个积性函数.做法之一是洲阁筛,也可以采用Min_25筛. 对于一个可以进行Min_25筛 ...
- LOJ #6202. 叶氏筛法(min_25 筛)
题意 求 \([L, R]\) 之间的素数之和 . \(L≤10^{10},2×10^{10} \le R \le 10^{11}\) 题解 一个有点裸的 min_25筛 ? 现在我只会筛素数的前缀和 ...
- UOJ188 Sanrd Min_25筛
传送门 省选之前做数论题会不会有Debuff啊 这道题显然是要求\(1\)到\(x\)中所有数第二大质因子的大小之和,如果不存在第二大质因子就是\(0\) 线性筛似乎可以做,但是\(10^{11}\) ...
- Min_25 筛小结
Min_25 筛这个东西,完全理解花了我很长的时间,所以写点东西来记录一些自己的理解. 它能做什么 对于某个数论函数 \(f\),如果满足以下几个条件,那么它就可以用 Min_25 筛来快速求出这个函 ...
随机推荐
- 在IIS下配置自定义的报错页面
这里介绍在IIS中配置自定义出错页面的方法,主要以404为例,其他状态可类推 1.远程桌面连接IIS所在的服务器,进入控制面板>系统和安全>管理工具,双击打开IIS管理器,选择需要配置的网 ...
- 关于WinPE安装操作系统
在WinPE安装操作系统,最好用虚拟光驱打开安装镜像文件,或者把镜像文件解压后直接安装. 最好不要用工具盘里所带的一键安装,复制等等功能,因为这些功能往往会安装一些其他的附带功能,不是清洁版的.
- Even uploading a JPG file can lead to Cross-Site Content Hijacking (client-side attack)!
Introduction: This post is going to introduce a new technique that has not been covered previously i ...
- Python多进程-进程锁
多进程虽然不允许多个进程同时修改同一份数据,但是多进程也有锁,为了在屏幕上打印的时候不出现两个进程同时执行的显示错误 # -*- coding:utf-8 -*- __author__ = " ...
- 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载
上篇博文我们介绍了mybatis的基本概念与原理,这篇博文我们通过Spring与Mybatis集成,开发一个简单用户增删改查的Web项目. 基本准备工作 1.安装JDK1.6以上版本,安装与配置 2. ...
- Java enum(枚举)使用详解之四
用法五:实现接口 所有的枚举都继承自java.lang.Enum类.由于Java 不支持多继承,所以枚举对象不能再继承其他类. public interface Behaviour { void pr ...
- 微信开发准备(二)--springmvc+mybatis项目结构的搭建
转自:http://www.cuiyongzhi.com/post/34.html 前面一篇有说道如何在MyEclipse中搭建maven项目,这里将继续介绍如何在搭建好的基础maven项目中引入我们 ...
- python之特殊方法
特殊方法的定义: 1.定义在某些class当中 2.不需要直接调用 3.Python的某些函数或者是操作符会调用相应的特殊方法 特殊方法很多,我们只需要编写用到的特殊方法,以及有关联性的特殊方法. — ...
- ssh整合(dao使用hibernateTemplate)
- os.path.join合并 os.path.dirname返回上一级目录 os.path.exists(path) os.stat('path/filename')获取文件/目录信息
import os str1 = "grsdgfd" str2 = "wddf" str3 = "gddgs" # print(str1 + ...