看了网上众多博客后,我才发现,实现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. markdown code test - markdown code test - markdown code test - markdown code test

    目录 主要代码 bottom cc 主要代码 <div class="tocCol1 js-toc"></div> <a>bc</a> ...

  2. MySQL触发器在建立时,报语法错的问题

    delimiter $$ create trigger trg_delete_on_users before DELETE on users for each row begin delete fro ...

  3. elasticsearch搭建并通过go-mysql-elasticsearch同步db数据达到搜索引擎的目的

    logstash-input-jdbc/elasticsearch-jdbc缺点:删除记录没有办法同步,只能两边执行自己的删除命令,版本16年后未更新. go-mysql-elasticsearch缺 ...

  4. win10配置java开发环境

    安装java(JDK) Oracle官网下载地址 选择JavaSE > Downloads 选择最新版本 > Download Accept License Agreement 选择要下载 ...

  5. 提高组noip2015

    一道二分答案裸题,一道dp,一道各种裸题的混合(树上差分+二分答案+LCA) stone: 二分查找裸题啊: int check(int x) { ,last=; ;i<=n;i++) if(a ...

  6. CentOS7.5 下搭建SFTP

    CentOS7.5 下搭建SFTP Linux 创建用户组 groupadd sftp 创建用户test useradd -G sftp -s /sbin/nologin test -s 禁止用户ss ...

  7. jquery延迟加载(懒加载)插件

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...

  8. error LNK1169 找到一个或多个多重定义的符号的解决方法

    问题描述如下: 有 三个源文件,A.h.B.cpp.C.cpp. A.h是头文件,其中声明了三个变量a1.a2. a3. B.cpp是A.h中所声明的类的实现源代码,C.cpp是主程序文件.B.cpp ...

  9. Pandas 基础(15) - date_range 和 asfreq

    这一节是承接上一节的内容, 依然是基于时间的数据分析, 接下来带大家理解关于 date_range 的相关用法. 首先, 引入数据文件: import pandas as pd df = pd.rea ...

  10. mysql查表的时候报错:java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timest

    在spark项目中读取mysql中的数据的时候,发生了报错: 原因:主要是因为数据库中有一些字段为null,无法进行转换: 上面字段那种,我的inserttime字段类型为timestamp类型,不为 ...