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. 树形dp——三色二叉树

    题目描述 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序列,我们称之为"二叉树序列S": 0 该树没有子节点 1S1 该树有一个子节点,S1为其二叉树序列 1S1S2 ...

  2. Java数组的定义与使用

    一.数组概念 可以将多个同一数据类型的数据,存储到同一个容器中 1. 格式 数据类型[] 数组名=new 数据类型[元素个数] "数据类型"表示该数组中可以存放哪一类型的数据 &q ...

  3. day02总结

    1.机器语言:直接用二进制指令编写程序 优点:程序的运行速度快 缺点: 1.编写程序太复杂了 2.记忆困难 2.汇编语言:用英文标签取代二进制指令去编写程序 方便记忆了, 但编写程序还是复杂的 3.高 ...

  4. Linux常用命令-文件传输类

    bye 功能说明:中断FTP连线并结束程序 语 法:bye 补充说明:在FTP模式下,输入bye即可中断正在执行的连线作业,并且结束FTP的执行 ftp(file transfer protocol) ...

  5. tensorflw-gpu 运行 。py程序出现gpu不匹配的问题

    安装好了tensorflow-gpu版本,然后程序中写好了 with tf.device('/gpu:0'):   但是python3 .py程序时还是有错误. 报错为: 2018-04-24 12: ...

  6. nginx配置文件服务器——带说明

    需求: 搭建一个文件服务器,提供指定软件下载,在访问文件服务器下载软件时,在访问的主页上要有对应的软件使用.安装等说明(本来是可以搞一个readme的,但这个在文件服务器上要下载还要打开,还不如直接显 ...

  7. 整理 Linux下列出目录内容的命令

    在 Linux 中,有非常多的命令可以让我们用来执行各种各样的任务.当我们想要像使用文件浏览器一样列出一个目录下的内容时,大家第一时间想到的是 ls 命令.但只有 ls 命令能实现这个目的吗?显然不是 ...

  8. Spring入门案例

    一.Spring基本介绍 1.什么是Spring Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制 ...

  9. 【真实分享】学习linux!让我工资翻5倍!从月薪3000到年薪18W!只用了六个月!

    月薪3000到年薪18W,我用了六个月时间.从只会皮毛,到一家公司的运维工程师主力,我的故事蛮神奇的,今天和大家分享一下我自己的经历. 我今年26岁,之前做个体,修过电脑,卖过电脑,做过桌面运维,一直 ...

  10. 导出Telegram贴纸

    如何导出Telegram的贴纸1.在Telegram中 @StickerSetBot 机器人2.输入 /newpack 开启机器人,会提示 OK now send me stickers or sti ...