首页 > 其他分享 >min25筛

min25筛

时间:2024-09-11 16:24:56浏览次数:1  
标签:return int min25 ans qkp ll mod





习题部分:


#include<bits/stdc++.h> 
using namespace std;
const int N = 1e6 + 10,mod = 1e9 + 7;
typedef long long ll;
ll n,sq;
ll v[N],prime[N],sp1[N],sp2[N],cnt;
ll g1[N],g2[N],w[N],id1[N],id2[N],tot;
ll qkp(ll a,ll b)
{
	ll ans = 1;
	for(;b;b>>=1)
	{
		if(b&1) ans = ans * a % mod;
		a = a * a % mod;
	}
	return ans;
}
ll inv2 = qkp(2,mod-2),inv6 = qkp(6,mod-2);
void init()
{
	for(int i=2;i<=sq;++i)
	{
		if(!v[i])
		{
			v[i] = prime[++cnt] = i;
			sp1[cnt] = (sp1[cnt-1] + i) % mod;
			sp2[cnt] = (sp2[cnt-1] + 1ll*i*i %mod) % mod;
		}
		for(int j=1;prime[j]*i<N;++j)
		{
			v[prime[j]*i] = prime[j];
			if(i%prime[j]==0) break;
		}
	}
}
ll g(ll k,ll x)
{
	return (k / (k / x));
}
ll S(ll i,ll j)
{
	if(prime[j] >= i) return 0;
	
	ll p = i <= sq ? id1[i] : id2[n/i];
	//g2存的是x^2,g1存的是x,而要求的是x^2-x,所以公式如下 
	ll ans = ( (g2[p] - g1[p] + mod) % mod - (sp2[j] - sp1[j] + mod) % mod + mod)  % mod;
	
	for(int k=j+1;prime[k]*prime[k]<=i && k<=cnt;k++)
	{
		ll pe = prime[k];
		for(int e=1;pe<=i;++e,pe = pe*prime[k])
		{
			ll x = pe % mod;
			ans = (ans + x*(x-1) % mod * (S(i/pe,k) + (e>1)) % mod) % mod;
		}
	}
	return ans;	
}
int main()
{
	scanf("%lld",&n);
	sq = sqrt(n);
	init();
	//相当于是把积性函数拆开为两个,x和x^2,进行分别运算 
	for(ll l=1,r;l<=n;l=r+1)//预处理g[x,0]
	{
		r = min(n,g(n,l));
		w[++tot] = n / l % mod;
		
		g1[tot] = ( w[tot] * (w[tot]+1) % mod * inv2 % mod -1 + mod) % mod;//对x求一个前缀和,因为1不大于第0个质数,所以要减去 
		//对x^2求一个前缀和,因为1不大于第0个质数,所以要减去 
		g2[tot] = ( w[tot] * (w[tot]+1) % mod * (2*w[tot]+1) % mod * inv6 % mod -1 + mod) % mod;
		
		w[tot] = n / l;
		if(w[tot]<=sq) id1[ w[tot] ] = tot;
		else id2[ n/w[tot] ] = tot;
	}
	//sp1和sp2存的是前面的所有质数的函数值的前缀和 
	for(int j=1;j<=cnt;++j) // g(n,j)
	{
		for(int i=1;i<=tot && prime[j]*prime[j]<=w[i];++i)
		{
			ll tmp = w[i] / prime[j];
			ll p = tmp <= sq ? id1[tmp] : id2[ n/tmp ];
			
			g1[i] = (g1[i] - prime[j] * (g1[p] - sp1[j-1] + mod) % mod + mod) % mod;
			g2[i] = (g2[i] - prime[j] * prime[j] % mod * (g2[p] - sp2[j-1] + mod) % mod + mod) % mod;
		}
	}
	
	printf("%lld\n",S(n,0) + 1);
	
	return 0;
}

标签:return,int,min25,ans,qkp,ll,mod
From: https://www.cnblogs.com/mendax-Z/p/18408444

相关文章

  • min25 小记
    min25筛可以处理这样一类问题:求$F(x)$的前缀和,其中$F(x)$是积性函数,且可以表示成$F(p)=p^a+p^b+...$这样的形式,其中$p$是质数。如果$F(p)$是多项式,我们把它们拆开分别算,然后加起来。我们希望先求出其质数位置上的值,设$g(i,j)$为$[2,i]$中,删去了$p_1$到......
  • Min25 筛法
    之前学习的的确是太浅薄了,于是重新学习一下。可以做什么?对于满足条件的积性函数\(f(n)\),求其前\(n\)项和\(\sum_{i=1}^nf(i)\)。需要准备些什么?设\(N=\{x|x=\lfloor\frac{n}{i}\rfloor\}\),即为所有整除的不同点值。设\(B=\sqrtn,p_{k}\)代表\(\leB\)的所有质......
  • min25筛的常数优化&“多记一维”的艺术
    前置知识:min25筛,即你要用min25筛通过板子题,不管写成啥样,不管常数多大,但是你要了解一点min25。没有特殊说明的话有如下记号(大部分记号与oi-wiki一致):\(x/y=\lfloor\frac{x}{y}\rfloor\)\(\text{P}\)为素数集合,\(p_k\)表示第\(k\)小素数。特别地,令\(p_{0}=1\)。\(\t......
  • min25筛学习笔记
    min25筛min25筛用于求一类数论函数的前缀和,适用于函数在素数处的取值可以用一个关于此素数的多项式来表示的数论函数。处理质数部分这部分我们需要解决\(\sum\limits_{p\subseteqprime}f(p)\),这里简单起见,假设\(f(p)=p^t\)用\(s_i\)表示前\(i\)个质数之和,用\(LPF_i\)表示\(i......
  • min25筛
    时间复杂度为解决的问题有:用来求积性函数前缀和,要求有是一个关于质数p的项数较小的多项式或者能快速求值可以快速求值前置知识:积性函数:对于互质的整数和有性质完全积性函数:对于任意整数和有性质规定是从小到大第零个质数,是从小到大第一个质数在以内没有任何一个合数的最小质因子......
  • 杜教筛 & Min25 筛
    发现这个东西很容易忘,果然还是理解不够吧,写一篇博客方便以后复习。杜教筛目的是要求\(S(n)=\sum_{i=1}^nf(i)\)。我们需要构造两个函数\(g,h\)满足\(f*g=h\),其中\(h\)是一个积性函数且能快速求和。考虑求\(\sum_{i=1}^n\sum_{d|i}f(d)g(\dfrac{i}{d})=\sum_{i=1}......
  • Min25筛
    博客两年没更了,其实博主有在打ACM,但是因为平时用Latex而不是Markdown所以就算写了点东西也懒得搬,最近准备搬点知识点总结过来用途求积性函数\(f\)的前缀和\(F(......
  • Loj 6053 简单的函数 min25筛
    #6053.简单的函数先求g(n,j)目的是为了在求S(n,j)的时候可以快速获取一些质数上的点的值。所以我们只要求g(n,j)的质数处的值正确即可其他值则不需要所以我们可以让g......
  • 【XSY3473】Frog(min25筛)
    一些记号:记\(\mathbb{P}\)为质数集,\(p_i\)表示第\(i\)个质数。记\(\operatorname{lpf}(x)\)表示\(x\)的最小质因数为第几个质数。特别地,令\(\operatorname{l......