看了网上众多博客后,我才发现,实现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. dell-7559安装deepin15.8

    这大概是我第三次尝试安装deepin了,上一次是显卡问题解决不了,这一次迷迷糊糊问题就解决了. 但是也是尝试了三五十次开机吧233333. 最终是EFI启动,grub引导deepin和win7. 我是 ...

  2. CH 5102Mobile Service题解

    题目: 用动态规划很容易将完成任务量作为dp的阶段,通过指派服务员,从当前i-1个任务转移到i个任务: 我们可以用一个四维数组f[i][x][y][z]来表示在完成当前任务i时,三个机器人分别在x,y ...

  3. AI illustrator 如何裁剪图片(扣取局部区域)

    AI如何裁剪图片 在使用illustrator的过程中,很多亲想要AI的裁剪功能与ps一样强大,但是AI常用的裁剪图片方法如下. 工具/原料  illustrator cs6 应用剪切蒙版剪切图片   ...

  4. parquet列式文件实战(未完,待续)

    parquet列式文件实战 parquet code demo http://www.programcreek.com/java-api-examples/index.php?source_dir=h ...

  5. zabbix服务器与客户端(Linux+Windows)的搭建

    zabbix监控搭建 一.搭建LNMP环境(MySQL) 创建数据库以及授权zabbix账户 mysql> create database zabbix character set utf8; ...

  6. SSH无法连接到服务器

    SSH服务器会无法连接,有时候并不是密码的问题,可能由于你上次改了密码(就算改成跟上次一样也是一个效果)导致家目录下的known_hosts(/root/.ssh/known_hosts)不一样了并且 ...

  7. 常看本地是否安装Git和maven工具

    打开cmd命令行工具: 查看git where git C:\Users\jasqia>where gitC:\Program Files\Git\cmd\git.exe 安装maven后需要到 ...

  8. Linux下安装docker

    //安装docker //需要输入时 输y就可以yum install -y epel-releaseyum install docker-io # 加入开机启动chkconfig docker on ...

  9. Notepad++对比文件

    Notepad++怎么对比文件,安装文件对比插件Compare pluginhttps://blog.csdn.net/qq_31772441/article/details/80306265 可以只 ...

  10. java枚举通俗实例解析

    1         枚举 1.1            枚举的作用 我们经常要定义一些常量值,例如日期(MONDAY,TUESDAY……)或者错误码等.可以将常量组织起来,统一进行管理.常量比较只是值 ...