min_25筛题目总结
看了网上众多博客后,我才发现,实现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筛题目总结的更多相关文章
- LG5325 【模板】Min_25筛
P5325 [模板]Min_25筛 题目背景 模板题,无背景. 题目描述 定义积性函数$f(x)$,且$f(p^k)=p^k(p^k-1)$($p$是一个质数),求 $$\sum_{i=1}^n f( ...
- 【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, ...
- 【SPOJ】DIVCNTK min_25筛
题目大意 给你 \(n,k\),求 \[ S_k(n)=\sum_{i=1}^n\sigma_0(i^k) \] 对 \(2^{64}\) 取模. 题解 一个min_25筛模板题. 令 \(f(n)= ...
- 【51NOD1847】奇怪的数学题 min_25筛
题目描述 记\(sgcd(i,j)\)为\(i,j\)的次大公约数. 给你\(n\),求 \[ \sum_{i=1}^n\sum_{j=1}^n{sgcd(i,j)}^k \] 对\(2^{32}\) ...
- 【51NOD1965】奇怪的式子 min_25筛
题目描述 给你\(n\),求 \[ \prod_{i=1}^n{\sigma_0(i)}^{i+\mu(i)} \] 对\({10}^{12}+39\)取模. \(\sigma_0(i)\)表示约数个 ...
- LOJ6053 简单的函数 【Min_25筛】【埃拉托斯特尼筛】
先定义几个符号: []:若方括号内为一个值,则向下取整,否则为布尔判断 集合P:素数集合. 题目分析: 题目是一个积性函数.做法之一是洲阁筛,也可以采用Min_25筛. 对于一个可以进行Min_25筛 ...
- [复习]莫比乌斯反演,杜教筛,min_25筛
[复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...
- LOJ.6235.区间素数个数(Min_25筛)
题目链接 \(Description\) 给定\(n\),求\(1\sim n\)中的素数个数. \(2\leq n\leq10^{11}\). \(Solution\) Min_25筛.只需要求出\ ...
- LOJ.6053.简单的函数(Min_25筛)
题目链接 Min_25筛见这里: https://www.cnblogs.com/cjyyb/p/9185093.html https://www.cnblogs.com/zhoushuyu/p/91 ...
随机推荐
- 基于MFC开发的指纹识别系统.
MFC-FingerPrint 基于MFC开发的指纹识别系统. 效果图如下: 在第12步特征入库中,会对当前指纹的mdl数据与databases中所有的mdl进行对比,然后返回识别结果. 一.载入图像 ...
- Developing Vert.x Modules using the Standard Project
The module The tests Unit tests Integration tests Java integration tests JavaScript integration test ...
- 简单GC具体操作参数查看
代码: public class HeapTest { private static final int _1M = 1024 * 1024; public static void main(Stri ...
- bzoj2131 免费的馅饼——树状数组优化dp
中文题目,问你最后能最多够得到多少价值的馅饼.因为宽度10^8且个数为10^5.所以不可以用dp[x][y]表示某时间某地点的最大权值. 假设你在x点处接到饼后想去y点接饼.那么需要满足的条件是t[y ...
- 解决 Cannot uninstall 'pyparsing' 问题
参考 pyparsing 无法卸载导致安装 matplotlib 出错 解决 Cannot uninstall 'pyparsing' 问题 在安装 pydot 时遇到依赖 pyparsing 无法更 ...
- threejs 草场足球运动视角(三)
这次要模拟的场景如下图:就是在绿草地上足球的运动,并且视角会随着足球的运动发生变化,同时整个草地的视角也会旋转. 接下来,我们就对各个元素进行分析: 1,草地 用PlaneGeometry在三维空间里 ...
- CEBX格式的文档如何转换为PDF格式文档、DOCX文档?
方正阿帕比CEBX格式的文档如何转换为PDF格式文档.DOCX文档? 简介: PDF.Doc.Docx格式的文档使用的非常普遍,金山WPS可以直接打开PDF和Doc.Docx文档,使用也很方便. CE ...
- HDU 3466 Proud Merchants(背包问题,要好好理解)
Problem Description Recently, iSea went to an ancient country. For such a long time, it was the most ...
- lua --- 表操作
c api 参考手册:http://www.leeon.me/a/lua-c-api-manual // LuaTest.cpp : 定义控制台应用程序的入口点. // #include " ...
- 20175317 《Java程序设计》第九周学习总结
20175317 <Java程序设计>第九周学习总结 学前准备 首先下载XAMPP,下载完成后打开: 将前两个选项打开 在IDEA中配置驱动mysql-connector-java-5.1 ...