【莫比乌斯反演】BZOJ3309 DZY Loves Math

Description

  对于正整数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)。T<=1e4; a,b<=1e7。

Solution

  一开始没仔细看数据范围然后打了一个每个询问O(n)的,当然T了

  (盗一张图)

  

  一开始我按照第二行的做的,里层外层循环都和ab有关,每一层都要sqrt(n)

  然后发现f(d)和ab无关,于是把f放到里面,把和ab有关的拎出来,就变成了第三行的式子

  这样里面一层循环与ab无关,可以预处理好

  我们要求的就是后面sigma的前缀和

  不难想到nlogn的预处理,但这题比较卡还是T

  于是要这么做

  

  设g(T)=Σ[d|T]f(d)μ(T/d)

  大力分析

  将T质因数分解,对于每一个p^a,T/d的p系数要么为0要么为1,否则μ(T/d)一定为0不考虑

  如果存在ai!=aj,关于T的因数p按a可以分为两个集合,a最大A集合和a非最大的B集合

  f取值由A集合的选取决定

  μ由选取的总个数决定

  无论A怎么选,在B中选取的奇偶方案数相同,于是总贡献一定为0

  也就是如果存在ai!=aj, g(T)=0

  那么a都相等的情况

  选奇数选偶数方案相同贡献也为0

  但如果p全部都选那么f的贡献为a-1(其余选法f贡献都为a)

  所以要多减一个1,考虑μ的影响,对于有k个p的T,g(T)=(-1)^(k+1)

  具体的计算方法在线性筛的时候记录一个当前最小素数的次数和去掉最小素数后上一个数

  如果清楚线性筛的原理那么还是很好想的

  预处理复杂度同线性筛,询问复杂度为sqrt(n)

Code

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define ll long long
 5 using namespace std;
 6 const int maxn=1e7+5;
 7
 8 bool flag[maxn]; int prime[maxn],cnt;
 9 int t[maxn],last[maxn],g[maxn];
10 int n,m;
11
12 void getmu(){
13     for(int i=2;i<=1e7;i++){
14         if(!flag[i]){
15             prime[++cnt]=i;
16             last[i]=t[i]=1;
17             g[i]=1;
18         }
19         for(int j=1;i*prime[j]<=1e7&&j<=cnt;j++){
20             int x=i*prime[j];
21             flag[x]=1;
22             if(i%prime[j]==0){
23                 last[x]=last[i];
24                 t[x]=t[i]+1;
25                 if(last[x]==1)
26                     g[x]=1;
27                 else
28                     g[x]=(t[last[x]]==t[x]?-g[last[x]]:0);
29                 break;
30             }
31             last[x]=i;
32             t[x]=1;
33             g[x]=(t[i]==1?-g[i]:0);
34         }
35     }
36     for(int i=1;i<=1e7;i++)
37         g[i]+=g[i-1];
38 }
39
40 ll f(int x,int y){
41     ll ret=0;
42     for(int i=1,pos=1;i<=x;i=pos+1){
43         pos=min(x/(x/i),y/(y/i));
44         ret+=1ll*(g[pos]-g[i-1])*(x/i)*(y/i);
45     }
46     return ret;
47 }
48
49 int main(){
50     getmu();
51
52     int T;
53     scanf("%d",&T);
54     while(T--){
55         scanf("%d%d",&n,&m);
56         if(n>m) swap(n,m);
57         printf("%lld\n",f(n,m));
58     }
59     return 0;
60 }
时间: 2024-10-16 20:29:52

【莫比乌斯反演】BZOJ3309 DZY Loves Math的相关文章

Bzoj3309 DZY Loves Math

Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 992  Solved: 589 Description 对于正整数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,表示一个

BZOJ3309 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). 输入格式 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. 输出格式 对于每一个询问,输出一行一个非负整数作为回答. 输入样例 4 7558588 9653114 6514903 4451211 742

【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化

3309: DZY Loves Math Description 对于正整数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 In

[BZOJ3568]DZY Loves Math VII

本人BZOJ的处女作. 这题题面还是蛮有趣的吧. 然后三个问题都蛮有意思的. 要保证正确性,出数据还是异常蛋疼啊. 本来各出三题的.但是考虑到是OJ上的题,就搞在一起了.这样代码量就会比较大. [BZOJ3568]DZY Loves Math VII,布布扣,bubuko.com

【BZOJ 3560】 3560: DZY Loves Math V (欧拉函数)

3560: DZY Loves Math V Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 241  Solved: 133 Description 给定n个正整数a1,a2,-,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,-,an. Output 仅一行答案. Sample Input 3 6 10 15 Sample Output 1595 HINT 1<=n<=1

bzoj 3309 DZY Loves Math

LINK:DZY Loves Math 一道比较有意思的数论题 原谅我的智障多调了40min. 可以简单的推式子推出 答案为\(\sum{w=1}^n\frac{n}{w}\frac{m}{w}\sum{x|w}\mu(x)f(\frac{w}{x})\) f函数定义和题目中一致. 考虑后面前缀和怎么求 发现光求f(x)复杂度都比较高.如果我们把f(x)求出再调和级数预处理 那得GG 1e7过不了log+根号 考虑考虑一下\(\mu\)和f的这种形式肯定值有局限 设后面的东西为g(x) 不难发现

【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 3309 DZY Loves Math

好久没有写反演了 感觉不会了 首先推一个经典的式子啊 \[ans = \sum_{D=1}^{n}\sum_{d|D}f(d)\mu(\frac{D}{d})\frac{n}{D}\frac{m}{D}\] 记\(g(D) = \sum_{d|D}f(d)\mu(\frac{D}{d})\) 结论挺好找的啊 把一个数拆成\({p_k}^{a_k}\)形式 如果所有\(a_k\)相同 那么\(g(D) = (-1)^{k+1}\) 否则\(g(D) = 0\) 证明就考虑两个集合 所有次幂为最大的