【题解】51Nod 1594 莫比乌斯反演

先咕了(等我学会Markdown

code

 1 //
 2 //  main.cpp
 3 //  51nod
 4 //
 5 //  Created by gengyf on 2019/8/8.
 6 //  Copyright © 2019 yifan Geng. All rights reserved.
 7 //
 8
 9 #include <iostream>
10 using namespace std;
11 namespace gengyf{
12 #define maxn 2000010
13 #define ll long long
14     inline int read(){
15         int f=1,x=0;char s=getchar();
16         while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=-1;s=getchar();}
17         while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();}
18         return f*x;
19     }
20     ll w[maxn>>2],miu[maxn],phi[maxn],c[maxn],vis[maxn];
21     int n,T,t;ll ans;
22     void init(){
23         phi[1]=miu[1]=1;
24         for(int i=2;i<=maxn;i++){
25             if(!vis[i]){//如果是质数
26                 miu[++w[++t]=i]=-1;
27                 phi[i]=i-1;
28             }
29             for(int j=1,k;(k=i*w[j])<=maxn;j++){
30                 vis[k]=1;
31                 if(i%w[j]==0){
32                     phi[k]=phi[i]*w[j];
33                     miu[k]=0;break;
34                 }
35                 phi[k]=phi[i]*(w[j]-1);miu[k]=-miu[i];
36             }
37         }
38     }
39     ll F(int x){return c[x]*c[x];}
40     ll calc(int n){
41         memset(c,0,sizeof(c));
42         ans=0;
43         for(int i=1;i<=n;i++){
44             ++c[phi[i]];
45         }
46         for(int i=1;i<=n;i++)
47             for(int j=i+i;j<=n;j+=i){
48                 c[i]+=c[j];
49             }
50         for(int i=1;i<=n;i++){
51             if(miu[i])
52                 for(int j=1;i*j<=n;j++){
53                     ans+=F(i*j)*miu[i]*phi[j];
54                 }
55         }
56         return ans;
57     }
58     int main(){
59         init();
60         T=read();
61         while(T--){
62             n=read();
63             printf("%lld\n",calc(n));
64         }
65         return 0;
66     }
67 }
68 int main(){
69     gengyf::main();
70     return 0;
71 }

原文地址:https://www.cnblogs.com/gengyf/p/11329759.html

时间: 2024-09-29 12:52:13

【题解】51Nod 1594 莫比乌斯反演的相关文章

Sdoi2015约数个数和题解莫比乌斯反演

题目描述 T组数据,求ΣNi=1ΣMj=1d(ij),d(x)代表x的约数个数. 1≤N,M,T≤105 题解 首先,膜拜一下PoPoQQQ大神及其题解 然后,有一个神奇的结论:ΣNi=1ΣMj=1d(ij)=ΣNi=1ΣMj=1[Ni][Mj][gcd(i,j)=1] 要证上式,只需证d(nm)=Σi|nΣj|m[gcd(i,j)=1],因为上式即为该式的前缀和形式. 分开考虑每个质数p对答案的贡献.设n=n′pk1,m=m′pk2,那p对d(nm)的贡献就是k1+k2+1,对等式右边的贡献是

【51nod】1222 最小公倍数计数 莫比乌斯反演+组合计数

[题意]给定a和b,求满足a<=lcm(x,y)<=b && x<y的数对(x,y)个数.a,b<=10^11. [算法]莫比乌斯反演+组合计数 [题解]★具体推导过程参考:51nod1222 最小公倍数计数 过程运用到的技巧: 1.将所有i和j的已知因子提取出来压缩上届. 2.将带有μ(k)的k提到最前面,从而后面变成单纯的三元组形式. 最终形式: $$ans=\sum_{k=1}^{\sqrt n} \mu(k)  \sum_{d}    \sum_{i} \s

【51Nod 1237】最大公约数之和 V3 莫比乌斯反演+杜教筛

题意 求$\sum_{i=1}^{n}\sum_{j=1}^{n}(i,j)$ 枚举约数 $$ \begin{align} ans &=\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[(i,j)=d] \ &=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{n}{d} \rfloor}[(i,j)=1] \ \end{align} $$ 利用

【莫比乌斯反演】BZOJ2005 [NOI2010]能量采集

Description 求sigma gcd(x,y)*2-1,1<=x<=n, 1<=y<=m.n, m<=1e5. Solution f(n)为gcd正好是n的(x,y)的个数 F(n)为gcd是n的倍数的(x,y)的个数 我们要求的就是f(i) 然而这个不好直接算,可F(i)可以直接用(n/i)*(m/i)得到 那么有F(n)=sigma n|i f(i) 于是有f(n)=sigma n|i mu(i)*F(i) 这就是莫比乌斯反演,不过这道题直接用容斥的思想想也很容易

【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛

题目描述 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 其中f(ij)表示ij的约数个数. 他发现答案有点大,只需要输出模1000000007的值. 输入 第一行一个整数n. 输出 一行一个整数ans,表示答案模1000000007的值. 样例输入 2 样例输出 8 题解 莫比乌斯反演+杜教筛 首先有个神奇

【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元

题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const ll mod = 1000000007; ll a[110][110] , p[1010] , v[1010]; ll pow(ll x , ll

【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

【bzoj2154】Crash的数字表格 莫比乌斯反演

题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1  2  3  4  5 2  2  6  4  10 3  6  3  12 15 4

【bzoj3994】[SDOI2015]约数个数和 莫比乌斯反演

题目描述 设d(x)为x的约数个数,给定N.M,求   输入 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. 输出 T行,每行一个整数,表示你所求的答案. 样例输入 2 7 4 5 6 样例输出 110 121 题解 莫比乌斯反演 根据 bzoj4176 推出的结论, 那么就有: 预处理mu及其前缀和. 由于要处理多组询问,所以需要用O(n√n)的时间预处理出f,然后对于每组询问分块来求. #include <cstdio> #incl