【莫比乌斯反演】【线性筛】hdu6134 Battlestation Operational

看这个题解吧:http://blog.csdn.net/wubaizhe/article/details/77338332

代码里顺便把几个常用的线性筛附上了。

#include<cstdio>
#include<algorithm>
using namespace std;
#define MOD 1000000007
#define N 1000000
bool notpri[N+5];
int pri[N+5],n,mu[N+5],sum[N+5];
typedef long long ll;
void shai_mu()//线性筛莫比乌斯函数,并处理出前缀和
{
    notpri[1]=1; mu[1]=1;
    for(int i=2;i<=N;i++){
        if(!notpri[i]){
            pri[++pri[0]]=i;
            mu[i]=-1;
        }
        for(int j=1;j<=pri[0] && (ll)i*(ll)pri[j]<=(ll)N;j++){
            notpri[i*pri[j]]=1;
            mu[i*pri[j]]=-mu[i];
            if(i%pri[j]==0){
                mu[i*pri[j]]=0;
                break;
            }
        }
    }
    sum[1]=mu[1];
    for(int i=2;i<=N;i++){
        sum[i]=sum[i-1]+mu[i];
    }
}
int ysgs[N+5],facnum[N+5],d[N+5]/*d(i)是辅助数组,记录每个数的最小质因子的幂次*/;
void shai_facnum()//线性筛每个数的约数个数
{
	facnum[1]=1;
	for(int i=2;i<=N;++i){
		if(!notpri[i]){
			facnum[i]=2;
			d[i]=1;
		}
		for(int j=1;j<=pri[0] && (ll)i*(ll)pri[j]<=(ll)N;++j){
			if(i%pri[j]==0){
				facnum[i*pri[j]]=facnum[i]/(d[i]+1)*(d[i]+2);
				d[i*pri[j]]=d[i]+1;
				break;
			}
			facnum[i*pri[j]]=facnum[i]*2;
			d[i*pri[j]]=1;
		}
	}
}
int g[N+5];
int main(){
	//freopen("hdu6134.in","r",stdin);
	shai_mu();
	shai_facnum();
	g[1]=1;
	for(int i=2;i<=N;++i){
		g[i]=(g[i-1]+(facnum[i-1]+1))%MOD;
	}
	for(int i=2;i<=N;++i){
		g[i]=(g[i]+g[i-1])%MOD;
	}
	while(scanf("%d",&n)!=EOF){
		int ans=0;
		for(int i=1;i<=n;){
			ans=(ans+(int)((((ll)(sum[n/(n/i)]-sum[i-1]+(ll)MOD)%(ll)MOD)*(ll)g[n/i])%(ll)MOD))%MOD;
			i=n/(n/i)+1;
		}
		printf("%d\n",ans);
	}
	return 0;
}
/*
线性筛欧拉函数
void get_eular()
{
    pnum = 0;
    for(int i = 2; i < MAX; i++)
    {
        if(!noprime[i])
        {
            p[pnum ++] = i;
            phi[i] = i - 1;
        }
        for(int j = 0; j < pnum && i * p[j] < MAX; j++)
        {
            noprime[i * p[j]] = true;
            if(i % p[j] == 0)
            {
                phi[i * p[j]] = phi[i] * p[j];
                break;
            }
            phi[i * p[j]] = phi[i] * (p[j] - 1);
        }
    }
}
*/
时间: 2024-08-05 07:08:06

【莫比乌斯反演】【线性筛】hdu6134 Battlestation Operational的相关文章

【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛

题目描述 给下N,M,K.求 输入 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. 输出 如题 样例输入 1 2 3 3 样例输出 20 题解 莫比乌斯反演+线性筛 $\sum\limits_{i=1}^n\sum\limits_{j=1}^m\gcd(i,j)^k\\=\sum\limits_{d=1}^{\min(n,m)}d^k\sum\limits_{i=1}^n\sum\limits

【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛

题目描述 对于正整数x,定义f(x)为x所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数n,m,求$\sum\limits_{i=1}^n\sum\limits_{j=1}^mf(\gcd(i,j))$ 输入 第一行一个数T,表示询问数.接下来T行,每行两个数n,m,表示一个询问. 输出 对于每一个询问,输出一行一个非负整数作为回答. 样例输入 4 7558588 9653114 6514903 445121

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

BZOJ 2693: jzptab [莫比乌斯反演 线性筛]

2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1194  Solved: 455[Submit][Status][Discuss] Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sample Output 122 HINT T <= 10000 N, M<=1000000

hdu.5212.Code(莫比乌斯反演 &amp;&amp; 线性筛)

Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 300    Accepted Submission(s): 124 Problem Description WLD likes playing with codes.One day he is writing a function.Howerver,his computer b

【BZOJ2694】Lcm 莫比乌斯反演+线性筛

[BZOJ2694]Lcm Description 对于任意的>1的n gcd(a, b)不是n^2的倍数也就是说gcd(a, b)没有一个因子的次数>=2 Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 4 2 4 3 3 6 5 8 3 Sample Output 24 28 233 178 HINT HINTT <= 10000 N, M<=4000000 题解:一

hdu6134 Battlestation Operational 莫比乌斯第一种形式

/** 题目:hdu6134 Battlestation Operational 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6134 题意:f(n) = sigma[1<=i<=n]sigma[1<=j<=i]ceil[i/j] (gcd(i,j)==1) 给定一个n,求f(n); 思路: 公式: n = sigma[d|n]phi[d] = sigma[d|n]phi[n/d]; phi[x]表示<=x的数与x互质的个数. 证

[bzoj2440]完全平方数[中山市选2011][莫比乌斯函数][线性筛][二分答案]

题意:求第k个分解质因子后质因子次数均为一的数,即求第k个无平方因子数. 题解: 首先二分答案mid,那么现在就是要求出mid以内的无平方因子数的个数. 其次枚举$\sqrt{mid}$内的所有质数,由容斥原理 $Num=0个质数平方的倍数的数量(1的倍数)-1个质数平方的倍数的数量(9,25...的倍数)$ $+2个质数平方的倍数的数量(36,100...的倍数)...$ 可以发现对于一个数x,x的倍数数量对答案的贡献符号为$\mu(x)$. 例如:9的倍数数量最答案的贡献是$\mu(9)\l

bzoj 3309 DZY Loves Math——反演+线性筛

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然后 f( ) 还不能一个就花 log 的时间,所以要分析性质. 设 n 一共 m 个质因数,其中最大的指数是 t . 已有 Σ(d|n) f(d)*u(n/d) ,如果 u( ) 的部分含有指数>=2的质因子,就无贡献:所以 u( ) 里每种质因数选1个或0个,一共 2^m 种. 如果 n 里有一个