LINK:Min_25筛

新版感觉有点鬼畜 而且旧版的也够用了至少.

这个并不算很简单也不算很困难的知识点 学起来还是很麻烦的。

(误入了很多dalao的blog 说的云里雾里的 甚是懵逼 这里推荐几个blog一起看 能看出很多门道

网上资源辣么多 我自然也不会去写一个非常正常的学习笔记辣.. 只会写几个容易疑惑的地方。

注意 学会 和会写代码是两码事 因为代码中有一些细节需要细细揣摩。

关于g数组的求出 其转移静下心来理解还是可以看懂的这里不再赘述。

注意 为了方便\(f(1)\)最后考虑.

设 \(maxx=\sqrt n\)

\(g_{n,j}=\sum_{i=1}^{n}f(i)[i\in P|min_p(i)>p_j]\)

关于g数组 第二维的范围显然只有\(maxx\)的大小。

因为大于maxx的转移都是承接上一个的状态 所以不必要求 或者可以理解欧拉筛的思想 筛到maxx大小的质数之后 所有数字都被筛完了。

考虑第一维 这是根据 我们后面的S组数来定的 但是注意到后面的S每次只会用到\(\frac{n}{p_i}\)

虽然我们不知道有多大但是数量级还是 是固定的 因为\(\frac{n}{i}\)最多只有\(maxx\)数量级 注意 真正的大小应该是\(2\cdot maxx\)

从状态转移方程 来看 第二维可以滚动。看似状态数量很多 实际上关于 \(p_j\cdot p_j>n\)的那些状态都是没有必要的 所以状态数量在一个可控范围。

一个笔者还未搞懂的问题 以后可能会完成回答:实际上在求g数组的时候利用到了完全积性函数的性质 当f不是完全积性函数的时候

不过很多blog上说可以这样做 且 只有\(g_{n,|P|}\)的位置上的值有效 这个地方还不太清楚为什么。

下面关于求答案的部分。

设\(S(n,j)=\sum_{i=1}^{n}f(i)[min_p(i)>=p_j]\)

容易得到\(S(n,1)+f(1)\) 且有\(S(i,j)=g_{i,|P|}-sum_{j-1}+\sum_{k>=j}\sum_{e}f(p^e)(S(\frac{i}{p^e},k+1)+[e\neq 1])\)

然后就没了 复杂度的大概就是1s 1e10,3s 1e11的样子。

code
//#include<bits/stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
#include<string>
#include<utility>
#include<queue>
#include<vector>
#include<algorithm>
#include<deque>
#include<stack>
#include<list>
#include<bitset>
#include<set>
#include<map>
#define INF 1000000000000000000ll
#define rep(p,n,i) for(int i=p;i<=n;++i)
#define fep(n,p,i) for(int i=n;i>=p;--i)
#define vep(p,n,i) for(int i=p;i<n;++i)
#define db double
#define get(x) x=read()
#define put(x) printf("%d\n",x)
#define pb push_back
#define ll long long
#define db double
#define mod 1000000007
#define putl(x) printf("%lld\n",x)
using namespace std;
char *fs,*ft,buf[1<<15];
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline ll read()
{
ll x=0,f=1;char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const int MAXN=200010,N=5,inv3=333333336;
ll n;
int maxx,cnt,top;
ll g1[MAXN],g2[MAXN],w[MAXN];
int sum1[MAXN],sum2[MAXN],id1[MAXN],id2[MAXN];
int v[MAXN],p[MAXN];
inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline void prepare()
{
rep(2,maxx,i)
{
if(!v[i])
{
v[i]=p[++top]=i;
sum1[top]=add(sum1[top-1],i);
sum2[top]=add(sum2[top-1],(ll)i*i%mod);
}
rep(1,top,j)
{
if(p[j]>maxx/i)break;
v[p[j]*i]=p[j];
if(v[i]==p[j])break;
}
}
}
inline void calc()
{
for(ll i=1,j;i<=n;i=j+1)
{
w[++cnt]=n/i;
j=n/w[cnt];
g1[cnt]=w[cnt]%mod;
g2[cnt]=g1[cnt]*(g1[cnt]+1)/2%mod*(2*g1[cnt]+1)%mod*inv3%mod-1;//平方和.
g1[cnt]=(1+g1[cnt])*g1[cnt]/2%mod-1;
if(w[cnt]<=maxx)id1[w[cnt]]=cnt;
else id2[j]=cnt;
}
rep(1,top,i)
{
rep(1,cnt,j)
{
if((ll)p[i]*p[i]>w[j])break;
ll cc=w[j]/p[i],k;
if(cc<=maxx)k=id1[cc];else k=id2[n/cc];
g1[j]=(g1[j]-p[i]*(g1[k]-sum1[i-1]))%mod;
g2[j]=(g2[j]-p[i]*(g2[k]-sum2[i-1])%mod*p[i])%mod;
}
}
}
inline int S(ll x,int y)
{
if(x<=1||p[y]>x)return 0;
int k=x<=maxx?id1[x]:id2[n/x];
ll ans=(g2[k]-g1[k]-sum2[y-1]+sum1[y-1])%mod;
for(int i=y;i<=top;++i)
{
if((ll)p[i]*p[i]>x)break;
ll pe=p[i],pp=pe*pe;
for(int e=1;pp<=x;++e,pe=pp,pp*=p[i])
{
ans=(ans+pe%mod*((pe-1)%mod)%mod*S(x/pe,i+1)+pp%mod*((pp-1)%mod)%mod)%mod;
}
}
return ans;
}
signed main()
{
freopen("1.in","r",stdin);
get(n);maxx=(int)sqrt(n*1.0)+1;
prepare();calc();put((S(n,1)+1+mod)%mod);
return 0;
}

luogu P5325 Min_25筛的更多相关文章

  1. Solution -「洛谷 P5325」Min_25 筛

    \(\mathcal{Description}\)   Link.   对于积性函数 \(f(x)\),有 \(f(p^k)=p^k(p^k-1)~(p\in\mathbb P,k\in\mathbb ...

  2. LG5325 【模板】Min_25筛

    P5325 [模板]Min_25筛 题目背景 模板题,无背景. 题目描述 定义积性函数$f(x)$,且$f(p^k)=p^k(p^k-1)$($p$是一个质数),求 $$\sum_{i=1}^n f( ...

  3. 数论(8):min_25 筛(扩展埃氏筛)

    min_25 筛介绍 我们考虑这样一个问题. \[ans=\sum_{i = 1}^nf(i)\\ \] 其中 \(1 \le n \le 10^{10}\) 其中 \(f(i)\) 是一个奇怪的函数 ...

  4. 【UOJ448】【集训队作业2018】人类的本质 min_25筛

    题目大意 给你 \(n,m\),求 \[ \sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\operatorname{lcm}(\gcd(i,x_1),\gcd(i, ...

  5. Min_25 筛 学习笔记

    原文链接https://www.cnblogs.com/zhouzhendong/p/Min-25.html 前置技能 埃氏筛法 整除分块(这里有提到) 本文概要 1. 问题模型 2. Min_25 ...

  6. UOJ188 Sanrd Min_25筛

    传送门 省选之前做数论题会不会有Debuff啊 这道题显然是要求\(1\)到\(x\)中所有数第二大质因子的大小之和,如果不存在第二大质因子就是\(0\) 线性筛似乎可以做,但是\(10^{11}\) ...

  7. 【SPOJ】DIVCNTK min_25筛

    题目大意 给你 \(n,k\),求 \[ S_k(n)=\sum_{i=1}^n\sigma_0(i^k) \] 对 \(2^{64}\) 取模. 题解 一个min_25筛模板题. 令 \(f(n)= ...

  8. 【51NOD1847】奇怪的数学题 min_25筛

    题目描述 记\(sgcd(i,j)\)为\(i,j\)的次大公约数. 给你\(n\),求 \[ \sum_{i=1}^n\sum_{j=1}^n{sgcd(i,j)}^k \] 对\(2^{32}\) ...

  9. 【51NOD1965】奇怪的式子 min_25筛

    题目描述 给你\(n\),求 \[ \prod_{i=1}^n{\sigma_0(i)}^{i+\mu(i)} \] 对\({10}^{12}+39\)取模. \(\sigma_0(i)\)表示约数个 ...

随机推荐

  1. 转载--gulp入门

    关于gulp的入门文章,先转载了 http://markpop.github.io/2014/09/17/Gulp%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/

  2. POJ 3463 Sightseeing 题解

    题目 Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the ...

  3. Report.Net 本地数据库、WebService、Socket报表

    本地.服务器的Access.Sql报表编辑.预览.打印. 可自定义预览界面,可方便嵌入到你的程序中去,提供接口函数,如有需要可自行添加接口. 预览采用单双面方式,因为如果页面过多,预览不能全部加载,所 ...

  4. 面向对象之多态(Java实现)

    本文借鉴于csdn,博客园,b站等各大知识分享平台 之前学习了封装与继承,封装就是数据的封装性(大致理解),继承就是一个类继承另一个类的属性,称为父子类 多态 多态是面向对象的第三大特性(共三大特性) ...

  5. scala 数据结构(六):映射 Map

    1 映射 Map-基本介绍 Scala中的Map介绍 1) Scala中的Map 和Java类似,也是一个散列表,它存储的内容也是键值对(key-value)映射,Scala中不可变的Map是有序的, ...

  6. leetcode_1-两数之和_javascript

    题目 1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元 ...

  7. vscode安装rainbow-fart(彩虹屁)插件,程序员只能自我鼓励了!!!

    2020-7-10更新 Rainbow Fart 插件现以发布到 VSCode 商店,安装过 VSIX 版本的用户请卸载之前的版本,从商店安装. 从 VSCode 扩展商店 下载并安装.(更新vsco ...

  8. Ethical Hacking - GAINING ACCESS(2)

    Server Side Attacks - INFORMATION GATHERING Need an IP address. Very simple if target is on the same ...

  9. 01 安装Linux虚拟机

    平常的工作学习中,Linux成为了一项比不可少的需要的掌握的技能,但是大部分人又不习惯于使用Linux进行生活,所以你需要在你的Windows电脑上安装一个虚拟机,那如何安装呢?其实不难,跟着我一步步 ...

  10. Ubuntu安装Docker(官方文档翻译)

    翻译自Docker官方文档 https://docs.docker.com/engine/installation/linux/ubuntulinux/ 之前因为看不懂官方文档,卡在某个步骤无法完成安 ...