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 筛来快速求出这个函 ...
随机推荐
- (转)heX——基于 HTML5 和 Node.JS 开发桌面应用
本文转载自:http://techblog.youdao.com/?p=685 简介:heX,一个允许你采用前端技术(HTML,CSS,JavaScript)开发桌面应用软件的跨平台解决方案.是你开发 ...
- SignalR推送服务在Android的实现 SignalA
SignalA是老外写的用于实现.net端推送消息至安卓端的实现,支持版本为android 2.3或以上,由于我的版本最低是2.2,所以只有把源码下下来自己改,如果你觉得太多了可自己编译成jar引用, ...
- c++如何编写线程安全的DLL
DLL有个共同的特点就是都有一个初始化函数,一个资源释放函数,其他几个函数都是核心功能函数.而且这些DLL有时会被多个进程同时调用,这就牵扯到多进程的多线程调用DLL的问题.有点绕口,以下我根据我实践 ...
- Java enum(枚举)使用详解之四
用法五:实现接口 所有的枚举都继承自java.lang.Enum类.由于Java 不支持多继承,所以枚举对象不能再继承其他类. public interface Behaviour { void pr ...
- LAMP 2.9 php扩展模块如何安装
php 和 apache 类似,核心文件为/usr/local/php/bin/php,针对 apache 的是/usr/local/apache2/modules/libphp5.so 模块.这两个 ...
- eclipse利用mybatis-generator生成代码
由于mybatis是半自动的ORM框架,表到POJO的映射可以由mybatis-generator完成,映射文件也可以由它生成,下面介绍生成步骤: 1.新建maven项目:File->Other ...
- Tiny4412 Uboot
1. Build uboot a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好 环境变量PATH,保证可以正常使用. b) 解 ...
- The Independent JPEG Group's JPEG software Android源码中 JPEG的ReadMe文件
The Independent JPEG Group's JPEG software========================================== README for rele ...
- TextView 点击拨打电话
点击TextView,拨打电话 TextView属性:android:autoLink="phone" 需要配置文件中的属性 <uses-permission android ...
- 【转】如何使用Java、Servlet创建二维码
归功于智能手机,QR码逐渐成为主流,它们正变得越来越有用.从候车亭.产品包装.家装卖场.汽车到很多网站,都在自己的网页集成QR码,让人们快速找到它们.随着智能手机的用户量日益增长,二维码的使用正在呈指 ...