HDU 5382 莫比乌斯反演

题目大意:

求S(n)的值 n<=1000000

这是官方题解给出的推导过程,orz,按这上面说的来写,就不难了

这里需要思考的就是G(n)这个如何利用积性函数的性质线性筛出来

作为一个质数,那么肯定G(i) = 2

1. 那么一个数 i 乘上了一个未出现的素数prime,那么就相当于,在当前符合的因子上面都乘了prime之后依旧符合,而原来 i 对应的数也符合,那么说明翻了两倍

也就是 g(i*prime) = 2*g(i) = g(prime) * g(i)

2. 如果这个乘上的素数prime已经存在于 i 中 , 那么仔细想一下,只有 i 那些符合的因子中已经带prime的必须再乘上这个prime,不然这个prime跑到 i/d中,gcd = prime了,其他的都不变,说明其实 g(i*prime) = g(i) 的

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4 #define N 1000000
 5 #define ll long long
 6 const int MOD=258280327;
 7
 8 ll g[N+5] , t[N+5] , f[N+5];
 9 ll sum[N+5];
10 int prime[N/5] , tot;
11 bool check[N+5];
12
13 void get_g()
14 {
15     g[1] = 1;
16     for(int i=2 ; i<=N ; i++){
17         if(!check[i]) prime[tot++] = i , g[i] = 2;
18         for(int j=0 ; j<tot ; j++){
19             if((ll)prime[j]*i>N) break;
20             check[prime[j]*i] = true;
21             if(i%prime[j]) g[prime[j]*i] = g[prime[j]]*g[i];
22             else {g[prime[j]*i]=g[i]; break;}
23         }
24     }
25 }
26
27 void get_t()
28 {
29     for(int k=2 ; k<=N ; k++)
30         for(int i=k ; i<=N ; i+=k)
31             t[i] = (t[i]+g[k-1])%MOD;
32 }
33
34 void get_f()
35 {
36     for(int i=1 ; i<=N ; i++)
37         f[i] = (f[i-1]+2*i-1-t[i-1])%MOD;
38 }
39
40 void init()
41 {
42     get_g();
43     get_t();
44     get_f();
45     for(int i=1 ; i<=N ; i++) sum[i] = (sum[i-1]+f[i])%MOD;
46 }
47
48 int main()
49 {
50     //freopen("a.in" , "r" , stdin);
51     init();
52     int T , n;
53     scanf("%d" , &T);
54     while(T--){
55         scanf("%d" , &n);
56         printf("%I64d\n" , sum[n]);
57     }
58     return 0;
59 }
时间: 2024-11-15 23:01:16

HDU 5382 莫比乌斯反演的相关文章

hdu 1695 莫比乌斯反演

hdu 1695 莫比乌斯反演 题意: 给出a,b,c,d,k, 求满足a <= x <= b && c <= y <= d && gcd(x,y)=k 的数对(x,y)的对数. 限制: a=c=1; 0 < b,c <= 1e5; (n1,n2) 和 (n2,n1) 算为同种情况 思路: 其实是求满足1 <= x <= b/k && 1 <= y <= d/k && gcd(x,y

HDU 1695 (莫比乌斯反演) GCD

题意: 从区间[1, b]和[1, d]中分别选一个x, y,使得gcd(x, y) = k, 求满足条件的xy的对数(不区分xy的顺序) 分析: 虽然之前写过一个莫比乌斯反演的总结,可遇到这道题还是不知道怎么应用. 这里有关于莫比乌斯反演的知识,而且最后的例题中就有这道题并给出了公式的推导. 1 #include <cstdio> 2 #include <algorithm> 3 typedef long long LL; 4 5 const int maxn = 1000000

HDU 4746 (莫比乌斯反演) Mophues

这道题看巨巨的题解看了好久,好久.. 本文转自hdu4746(莫比乌斯反演) 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<=n, 1<=b<=m) 分析:设A(d):gcd(a, b)=d的有多少种      设B(j): gcd(a, b)是j的倍数的有多少种,易知B(j) = (n/j)*(m/j)      则由容斥原理得:(注:不同行的μ是不相同的,μ为莫比乌斯函数)      A(1) = μ(1)*B(1)

hdu 4746Mophues[莫比乌斯反演]

Mophues Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327670/327670 K (Java/Others) Total Submission(s): 1669    Accepted Submission(s): 675 Problem Description As we know, any positive integer C ( C >= 2 ) can be written as the multiply of

hdu1569 莫比乌斯反演

hdu 1695 莫比乌斯反演 给出a,b,c,d,k, 求满足a <= x <= b && c <= y <= d && gcd(x,y)=k 的数对(x,y)的对数. a=c=1; 0 < b,c <= 1e5; (n1,n2) 和 (n2,n1) 算为同种情况 其实是求满足1 <= x <= b/k && 1 <= y <= d/k && gcd(x,y)=1 的 数对(x,y

hdu 1695 容斥原理或莫比乌斯反演

GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5310    Accepted Submission(s): 1907 Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y)

HDU 4746 Mophues (莫比乌斯反演应用)

Mophues Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327670/327670 K (Java/Others) Total Submission(s): 980    Accepted Submission(s): 376 Problem Description As we know, any positive integer C ( C >= 2 ) can be written as the multiply of

E - GuGuFishtion HDU - 6390(欧拉函数 / 莫比乌斯反演)

GuGuFishtion (HDU - 6390) 题意: 定义\(G_u (a,b)=\frac{\phi(ab)}{\phi(a)\phi(b)}\). 求\((\sum\limits_{a=1}^m\sum\limits_{b=1}^nG_u (a,b))\pmod p\). 题解: 考虑\(\phi(x) = x*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})...*(1-\frac{1}{p_n})\). 将\(G_u (a,b)\)的分子与分母按上述分解.约分

HDU - 6715 - 算术 = 莫比乌斯反演

http://acm.hdu.edu.cn/showproblem.php?pid=6715 题意: 求:\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\mu(lcm(i,j))\),其中n,m是1e6范围内,10组. 不会,想了很久,也不知道假在哪里.大概是一开始方向就错了. 正解: 所求:\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\mu(lcm(i,j))\) 即:\(\sum\limits_{i=1}^