看了网上众多博客后,我才发现,实现min_25只有脑子,没有代码。

当然可能是我太ruo了。

min_25是一种想法,不是算法。

不要尝试套模板,因为很多题目并没有什么用。

最重要的一点,g不要看成是函数,而是埃式筛第j轮后的剩下的数的F之和;S看成dp来做,也不要记忆化。

1.求[1,n]中素数个数。n≤1E11

 #include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll maxn=1E6+;
ll n,prime[maxn],size,sqr,back[maxn],m,g[maxn],id1[maxn],id2[maxn];
bool vis[maxn];
void init(ll n)
{
for(int i=;i<=n;++i)
{
if(!vis[i])prime[++size]=i;
for(int j=;j<=size&&i*prime[j]<=n;++j)
{
vis[i*prime[j]]=;
if(i%prime[j]==)break;
}
}
}
void put(ll x,int y)
{
if(x<=sqr)id1[x]=y;
else id2[n/x]=y;
}
int where(ll x)
{
if(x<=sqr)return id1[x];
else return id2[n/x];
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
sqr=sqrt(n)+;
init(sqr);
for(ll i=,j;i<=n;i=j+)
{
back[++m]=n/i;
j=n/back[m];
put(n/i,m);
g[m]=back[m]-;
}
for(int j=;j<=size;++j)
{
ll limit=prime[j]*prime[j];
for(int i=;back[i]>=limit;++i)
{
int k=where(back[i]/prime[j]);
g[i]+=j--g[k];
}
}
cout<<g[]<<endl;
return ;
}

2.求[1,n]中素数个数和。n≤1E11

 #include<bits/stdc++.h>
#define mod 1000000007
#define G 500000004
using namespace std;
typedef long long int ll;
const ll maxn=1E6+;
ll prime[maxn],size,id1[maxn],id2[maxn],m,n,back[maxn],sumF[maxn],sqr,g[maxn];
bool vis[maxn];
void put(ll x,ll y)
{
if(x<=sqr)id1[x]=y;
else id2[n/x]=y;
}
ll where(ll x)
{
if(x<=sqr)return id1[x];
else return id2[n/x];
}
ll sum(ll n)
{
return (n*(n+)%mod*G-+mod)%mod;
}
void init(int n)
{
for(int i=;i<=n;++i)
{
if(!vis[i])prime[++size]=i,sumF[size]=(sumF[size-]+i)%mod;
for(int j=;j<=size&&i*prime[j]<=n;++j)
{
vis[i*prime[j]]=;
if(i%prime[j]==)break;
}
}
}
void calc()
{
for(int j=;j<=size;++j)
{
ll limit=prime[j]*prime[j];
for(int i=;back[i]>=limit;++i)
{
int k=where(back[i]/prime[j]);
g[i]=(g[i]-prime[j]*(g[k]-sumF[j-])%mod+mod)%mod;
}
}
}
void make()
{
for(ll i=,j;i<=n;i=j+)
{
back[++m]=n/i;
j=n/back[m];
put(n/i,m);
g[m]=sum(n/i);
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
sqr=sqrt(n)+;
init(sqr);
make();
calc();
cout<<g[]<<endl;
return ;
}

3.loj6053(目前不知为何会爆long long,也许是其他原因?)

 #include<bits/stdc++.h>
#define mod 1000000007
#define G 500000004
using namespace std;
typedef long long int ll;
const ll maxn=1E6+;
ll g1[maxn],g2[maxn],back[maxn],id1[maxn],id2[maxn],n,m,sqr,size,prime[maxn],sumPrime[maxn];
bool vis[maxn];
void init(ll n)
{
for(ll i=;i<=n;++i)
{
if(!vis[i])prime[++size]=i,sumPrime[size]=(sumPrime[size-]+i)%mod;
for(ll j=;j<=size&&prime[j]*i<=n;++j)
{
vis[prime[j]*i]=;
if(i%prime[j]==)break;
}
}
}
void put(ll x,ll y)
{
if(x<=sqr)id1[x]=y;
else id2[n/x]=y;
}
ll where(ll x)
{
if(x<=sqr)return id1[x];
else return id2[n/x];
}
ll sum2(ll n){return ((n+)*n%mod*G%mod-+mod)%mod;}
void make()
{
for(ll i=,j;i<=n;i=j+)
{
back[++m]=n/i;
j=n/back[m];
put(n/i,m);
g1[m]=(back[m]-+mod)%mod;
g2[m]=sum2(back[m]);
}
}
void calc1()
{
for(ll j=;j<=size;++j)
{
ll limit=prime[j]*prime[j];
for(ll i=;back[i]>=limit;++i)
{
ll k=where(back[i]/prime[j]);
g1[i]=(g1[i]-g1[k]+j-+mod)%mod;
}
}
}
void calc2()
{
for(ll j=;j<=size;++j)
{
ll limit=prime[j]*prime[j];
for(ll i=;back[i]>=limit;++i)
{
ll k=where(back[i]/prime[j]);
g2[i]=(g2[i]-prime[j]*(((g2[k]-sumPrime[j-])%mod+mod)%mod)%mod+mod)%mod;
}
}
}
ll S(ll n,ll j)
{
ll k,sum=;
if(n<=||prime[j]>n)return ;
k=where(n);
sum=(g2[k]-sumPrime[j-]-g1[k]+j-+mod)%mod;
if(j==)sum=(sum+)%mod;
for(ll i=j;i<=size&&prime[i]*prime[i]<=n;++i)
for(ll e=,s=prime[i]*prime[i];s<=n;s*=prime[i],++e)
(sum+=(prime[i]^e)*S(n*prime[i]/s,i+)%mod+(prime[i]^(e+))%mod)%=mod;
return sum;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
if(n==){cout<<<<endl;return ;}
if(n==){cout<<<<endl;return ;}
sqr=sqrt(n)+;
init(sqr);
make();
calc1();
calc2();
cout<<(S(n,)+)%mod;
return ;
}

4.求[1,n]中phi的和。保证结果不超过long long。

 #include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll maxn=1E6+;
ll back[maxn],id1[maxn],id2[maxn],n,m,size,prime[maxn],sqr,sumPrime[maxn];
ll g1[maxn],g2[maxn];
bool vis[maxn];
void put(ll x,ll y)
{
if(x<=sqr)id1[x]=y;
else id2[n/x]=y;
}
ll where(ll x)
{
if(x<=sqr)return id1[x];
else return id2[n/x];
}
void init(ll s)
{
for(int i=;i<=s;++i)
{
if(!vis[i])prime[++size]=i,sumPrime[size]=sumPrime[size-]+i;
for(int j=;j<=size&&prime[j]*i<=s;++j)
{
vis[prime[j]*i]=;
if(i%prime[j]==)break;
}
}
for(ll i=,j;i<=n;i=j+)
{
back[++m]=n/i;
j=n/back[m];
put(n/i,m);
g1[m]=n/i-;
g2[m]=(back[m]+)*back[m]/-;
}
}
void calc1()
{
for(int j=;j<=size;++j)
{
ll limit=prime[j]*prime[j];
for(int i=;back[i]>=limit;++i)
{
int k=where(back[i]/prime[j]);
g1[i]-=g1[k]-j+;
}
}
}
void calc2()
{
for(int j=;j<=size;++j)
{
ll limit=prime[j]*prime[j];
for(int i=;back[i]>=limit;++i)
{
int k=where(back[i]/prime[j]);
g2[i]-=prime[j]*(g2[k]-sumPrime[j-]);
}
}
for(int i=;i<=m;++i)g2[i]-=g1[i];
}
ll S(ll n,ll j)
{
if(n<prime[j])return ;
int k=where(n);
ll sum=g2[k]-sumPrime[j-]+j-;
for(ll i=j;prime[i]*prime[i]<=n;++i)
for(ll e=,s=prime[i]*prime[i],ans=(prime[i]-);s<=n;s*=prime[i],ans*=prime[i],++e)
sum+=ans*S(n*prime[i]/s,i+)+ans*prime[i];
return sum;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
sqr=sqrt(n)+;
init(sqr);
calc1();
calc2();
cout<<S(n,)+<<endl;
return ;
}

5.求[1,n]中mu的和。

考虑到mu函数中若指数大于等于2,就为0了,所以在S函数中不需要枚举指数。

 #include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll maxn=1E6+;
ll back[maxn],id1[maxn],id2[maxn],n,m,size,prime[maxn],sqr;
ll g[maxn];
bool vis[maxn];
void put(ll x,ll y)
{
if(x<=sqr)id1[x]=y;
else id2[n/x]=y;
}
ll where(ll x)
{
if(x<=sqr)return id1[x];
else return id2[n/x];
}
void init(ll s)
{
for(int i=;i<=s;++i)
{
if(!vis[i])prime[++size]=i;
for(int j=;j<=size&&prime[j]*i<=s;++j)
{
vis[prime[j]*i]=;
if(i%prime[j]==)break;
}
}
for(ll i=,j;i<=n;i=j+)
{
back[++m]=n/i;
j=n/back[m];
put(n/i,m);
g[m]=n/i-;
}
}
void calc()
{
for(int j=;j<=size;++j)
{
ll limit=prime[j]*prime[j];
for(int i=;back[i]>=limit;++i)
{
int k=where(back[i]/prime[j]);
g[i]-=g[k]-j+;
}
}
}
ll S(ll n,ll j)
{
if(n<prime[j])return ;
int k=where(n);
ll sum=g[k]-j+;
for(ll i=j;prime[i]*prime[i]<=n;++i)
sum+=-S(n/prime[i],i+);
return sum;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
sqr=sqrt(n)+;
init(sqr);
calc();
cout<<-S(n,)+<<endl;
return ;
}

ATTENTION:筛的质数个数一定要开大一点!不然可能会有一些特别的边界来卡掉。

6.积性函数f(pk)=(pk(pk-1)),求前缀和。

把质数拆成p2-p,算出质数前缀和和质数平方前缀和,然后合并一下。

 #include<bits/stdc++.h>
#define mod 1000000007
#define G 166666668
#define Gi 500000004
using namespace std;
typedef long long int ll;
const ll maxn=1E6+;
ll n,m,id1[maxn],id2[maxn],sqr,back[maxn],g1[maxn],g2[maxn];
ll sumPrimeS[maxn],prime[maxn],Size,sumPrime[maxn];
bool vis[maxn];
ll qpow(ll x,ll y)
{
ll ans=,base=x;
while(y)
{
if(y&)ans=ans*base%mod;
base=base*base%mod;
y>>=;
}
return ans;
}
void put(ll x,ll y)
{
if(x<=sqr)id1[x]=y;
else id2[n/x]=y;
}
ll where(ll x)
{
if(x<=sqr)return id1[x];
else return id2[n/x];
}
void init(ll q)
{
for(ll i=;i<=q;++i)
{
if(!vis[i])
{
prime[++Size]=i;
sumPrime[Size]=(sumPrime[Size-]+i)%mod;
sumPrimeS[Size]=(sumPrimeS[Size-]+i*i%mod)%mod;
}
for(ll j=;j<=Size&&prime[j]*i<=q;++j)
{
vis[i*prime[j]]=;
if(i%prime[j]==)break;
}
}
for(ll i=,j;i<=n;i=j+)
{
back[++m]=n/i;
j=n/back[m];
put(n/i,m);
g1[m]=((back[m]+)%mod*back[m]%mod*Gi%mod-+mod)%mod;
g2[m]=(back[m]%mod*(back[m]+)%mod*(back[m]*%mod+)%mod*G%mod-+mod)%mod;
}
}
void calc1()
{
for(ll j=;j<=Size;++j)
{
ll limit=prime[j]*prime[j];
for(ll i=;back[i]>=limit;++i)
{
ll k=where(back[i]/prime[j]);
g1[i]=(g1[i]-((g1[k]-sumPrime[j-]+mod)%mod)*prime[j]%mod+mod)%mod;
}
}
}
void calc2()
{
for(ll j=;j<=Size;++j)
{
ll limit=prime[j]*prime[j];
for(ll i=;back[i]>=limit;++i)
{
ll k=where(back[i]/prime[j]);
g2[i]=(g2[i]-((g2[k]-sumPrimeS[j-]+mod)%mod)*prime[j]%mod*prime[j]%mod+mod)%mod;
}
}
}
ll S(ll n,ll j)
{
// cout<<n<<' '<<j<<endl;
if(n<prime[j])return ;
ll k=where(n);
ll sum=(g1[k]-sumPrimeS[j-]+sumPrime[j-]+mod)%mod;
for(ll i=j;prime[i]*prime[i]<=n;++i)
for(ll e=,s=prime[i],ans=prime[i];s<=n;++e,s*=prime[i],ans=ans*prime[i]%mod)
{
sum=(sum+S(n/s,i+)*ans%mod*(ans-)%mod)%mod;
if(e!=)sum=(sum+ans*(ans-)%mod)%mod;
}
return sum;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
sqr=sqrt(n)+;
init(sqr);
calc1();
calc2();
for(ll i=;i<=m;++i)
g1[i]=(g2[i]-g1[i]+mod)%mod;
cout<<S(n,)+<<endl;
return ;
}

https://www.luogu.org/problemnew/show/P5325

min_25筛题目总结的更多相关文章

  1. LG5325 【模板】Min_25筛

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

  2. 【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, ...

  3. 【SPOJ】DIVCNTK min_25筛

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

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

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

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

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

  6. LOJ6053 简单的函数 【Min_25筛】【埃拉托斯特尼筛】

    先定义几个符号: []:若方括号内为一个值,则向下取整,否则为布尔判断 集合P:素数集合. 题目分析: 题目是一个积性函数.做法之一是洲阁筛,也可以采用Min_25筛. 对于一个可以进行Min_25筛 ...

  7. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

  8. LOJ.6235.区间素数个数(Min_25筛)

    题目链接 \(Description\) 给定\(n\),求\(1\sim n\)中的素数个数. \(2\leq n\leq10^{11}\). \(Solution\) Min_25筛.只需要求出\ ...

  9. LOJ.6053.简单的函数(Min_25筛)

    题目链接 Min_25筛见这里: https://www.cnblogs.com/cjyyb/p/9185093.html https://www.cnblogs.com/zhoushuyu/p/91 ...

随机推荐

  1. 初涉wheel 组

    入门 在一次处理su切换的问的时候出现一个问题, [cheng1@localhost ~]$ su cheng2 密码: su: 鉴定故障 [cheng1@localhost ~]$ 试过很多次, 也 ...

  2. redis 执行操作时提示(error) NOAUTH Authentication required.

    (error) NOAUTH Authentication required. 出现认证问题,设置了认证密码,输入密码即可 127.0.0.1:6379> auth 123456

  3. Django中的FBV与CBV

    一. FBV FBV(function based views) 基于函数的视图, 即一个url对应一个视图函数. 1.1 FBV代码示例 urls.py from django.contrib im ...

  4. eval()和JSON.parse()的区别

    我们将一个josn字符串解析为对象的时可以使用两种方法: 假设有一个json字符串: '{ "student" : [ {}, {}, {} ] }' 然后解析为对象: 1.eva ...

  5. centos7——mysql5.7忘记root密码的处理方式

    参考资料:https://www.cnblogs.com/nangch/p/5521193.html 解决方法: 一.通过编辑/etc/my.cnf文件在[mysqld]下面加上skip-grant- ...

  6. Struts 2 框架搭建HelloWorld

    1.导包 导入相应的jar包,在blank项目中会出现 2.书写Action类 package com.littlepage.struts; public class HelloAction { pu ...

  7. JQurey 添加和删除元素

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...

  8. python 绘制点线

    plot(x, y) #默认为蓝色实线 plot(x, y, 'r*') #红色星状标记 plot(x, y, 'go-') #带有圆圈标记的绿线 plot(x, y, 'ks:') #带有正方形标记 ...

  9. 如何成为F1车手?

    sorry,玩了几天的GT sport才发现赛车有多难,理论的最佳走线是存在的,但是真实的赛道实在是千变万化,弯道形状角度.高低差.F1还有温度和风速,甚至是路面上的一个碎石都会极大地影响你的成绩.赛 ...

  10. cowboy源码分析(三)

    上接 cowboy源码分析(二) 我们接着分析cowboy_protocol.erl的request/7模块 -module(cowboy_protocol). %% API.-export([sta ...