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 Input

4
7558588 9653114
6514903 4451211
7425644 1189442
6335198 4957

Sample Output

35793453939901
14225956593420
4332838845846
15400094813

HINT

【数据规模】

T<=10000

1<=a,b<=10^7

参考博文:PoPoQQQ

盗的

我主要讲讲为什么只有在当T素因数分解所有的幂指数都相等时才会有(-1)k+1的贡献;

为了能将内层循环优化掉,就需要将a,b提出来,预处理;这时就变成第三步了,对T质因数分解为 T = p1^a1*p2^a2*...*pk^ak;

有莫比乌斯反演公式易知,d|T要使得mu[T/d] != 0只有每一个素因子的系数均 <= 1才行,这时总的d 的取法就为2k(k为T质因子的个数);

<1>当a1 = ... = ak = a时,对于f[d]易知只有当全部取的都是a-1时,才为a-1,这时只有一种情况;贡献为(a-1)*(-1)^k = a*(-1)^k + (-1)^k;

f[d] = a需要用组合数求解;(组合数为C(k,i),其中i表示取a-1的个数,即i = 0,1,...,k-1),这里i != k;(i = k时就是f[d] = a-1了),

这时的贡献为a*((-1)^0*C(k,0)+(-1)^1*C(k,1)+...+(-1)^(k-1)*C(k,k-1)) = ?

直接看(1-1)^K就会发现少了a*(-1^k*C(K,K)) = a*(-1)^k,所以加上第一种情况之后,需要-(-1)^k = (-1)k+1

<2> 当存在ai != aj时,最大幂无论去a还是a-1都是f[d]的取值,所以不可能出现分情况讨论,这时其他的去aj | aj-1都会造成奇偶的变化而使得f[d]变为0;

所以结论就是只有a1 = a2 = ... = ak = a时,Σf[d]*μ(T/d)才不为0,且f[d]是不需要计算的,要得到的只是k的奇偶 = > (-1)^(k+1)

预处理时间复杂度与筛法相同O(n);之后每组数据处理时间为O(sqrt(n)),即分块加速;

编码的细节:里面使用了递推来得到g[]:得到当前值为0还是1;即(-1)^(k+1),之后使用前缀和是为了分块加速;

同样递推还用在了a[i] : i的最小质因子的幂指数;val[i]:i最小质因子的幂指数乘积即p1^a1,这是为了在之后得到g[i]的时候,判断a[i] ?= a[j/val[i]]即最小的质因子的幂指数是否和倒数第二小的幂指数相等。注意这里是递推关系,即并不是只比较了最小的两个幂指数,就相当于马尔科夫链一样~~继承下来了~~(只是看别人的code的理解)巧妙 orz

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<stdlib.h>
  6. using namespace std;
  7. #define rep0(i,l,r) for(int i = (l);i < (r);i++)
  8. #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
  9. #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
  10. #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
  11. #define inf 0x7fffffff
  12. typedef long long ll;
  13. template<typename T>
  14. void read1(T &m)
  15. {
  16. T x=,f=;char ch=getchar();
  17. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  18. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  19. m = x*f;
  20. }
  21. template<typename T>
  22. void read2(T &a,T &b){read1(a);read1(b);}
  23. template<typename T>
  24. void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
  25. const int N = 1e7+;
  26. int vis[N],g[N],p[N],a[N],val[N];
  27. void init()
  28. {
  29. rep0(i,,N){
  30. if(vis[i] == ){
  31. p[++p[]] = i;
  32. g[i] = ;
  33. a[i] = ;
  34. val[i] = i;
  35. }
  36. for(int j = ;p[j]*i < N;j++){
  37. vis[i*p[j]] = ;
  38. if(i%p[j] == ){
  39. a[i*p[j]] = a[i]+;//最小质因数的幂指数;
  40. val[i*p[j]] = val[i]*p[j];
  41. int tmp = i/val[i];
  42. if(tmp == ) g[i*p[j]] = ;//只有一个质因数
  43. else
  44. g[i*p[j]] = (a[tmp] == a[i*p[j]]?-g[tmp]:);
  45. break;
  46. }
  47. a[p[j]*i] = ;//表示p[j]的次数为1;
  48. val[i*p[j]] = p[j];
  49. g[p[j]*i] = (a[i] == ?-g[i]:);
  50. }
  51. }
  52. rep0(i,,N) g[i] += g[i-];
  53. }
  54. int main()
  55. {
  56. init();
  57. int n,m,T,i,j;
  58. read1(T);
  59. while(T--){
  60. read2(n,m);
  61. ll ans = ;
  62. if(n > m) swap(n,m);
  63. for(i = ;i <= n;i = j + ){
  64. j = min(n/(n/i),m/(m/i));
  65. ans += 1LL*(g[j] - g[i-])*(n/i)*(m/i);
  66. }
  67. printf("%lld\n",ans);// I64d是会WA的,运行系统不同的结果..
  68. }
  69. return ;
  70. }

【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化的更多相关文章

  1. bzoj 3309 DZY Loves Math 莫比乌斯反演

    DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1303  Solved: 819[Submit][Status][Dis ...

  2. BZOJ 3309 DZY Loves Math ——莫比乌斯反演

    枚举$d=gcd(i,j)$ 然后大力反演 ——来自Popoqqq的博客. 然后大力讨论后面的函数的意义即可. http://blog.csdn.net/popoqqq/article/details ...

  3. bzoj 3309 DZY Loves Math —— 莫比乌斯反演+数论分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 凭着上课所讲和与 Narh 讨论推出式子来: 竟然是第一次写数论分块!所以迷惑了半天: ...

  4. BZOJ 3309: DZY Loves Math [莫比乌斯反演 线性筛]

    题意:\(f(n)\)为n的质因子分解中的最大幂指数,求\(\sum_{i=1}^n \sum_{j=1}^m f(gcd(i,j))\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d| ...

  5. BZOJ 3309: DZY Loves Math 莫比乌斯反演+打表

    有一个神奇的技巧——打表 code: #include <bits/stdc++.h> #define N 10000007 #define ll long long #define se ...

  6. ●BZOJ 3309 DZY Loves Math

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...

  7. BZOJ 3309: DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 761  Solved: 401[Submit][Status ...

  8. 【BZOJ3309】DZY Loves Math 莫比乌斯反演+线性筛(好题)

    [BZOJ3309]DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10 ...

  9. 【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 ...

随机推荐

  1. JavaScript网站设计实践(一)网站结构以及页面效果设计

    这是JavaScript DOM编程艺术里的构建JavaScript网站设计的例子,这本书给我学习JavaScript带来许多启发,在这个乐队宣传网站中,把前面学到的知识点整合在这个项目了.在这里记录 ...

  2. 将项目添加到Finder侧边栏和工具栏

    转: http://www.cnblogs.com/wormday/archive/2011/05/08/2039468.html 1.在侧边栏和工具栏右键,有相应的设置选项 2.可以将项目拖到侧边栏 ...

  3. swift 如何使用OC中宏的功能

    swift中没有宏的概念,那么我们在swift使用宏的功能来提高效率呢? 一.使用关键字 let 来声明一个常量 存储相应的值,以下代码声明了常量  myColor 来存储一种指定的颜色 let my ...

  4. Android 自学之基本界面组件(上)

    文本款(TextView)和编辑框(EditText)的功能和用法 TextView直接继承了View,他还是EditText.Button两个UI组件的父类,TextView的作用就是在界面上显示文 ...

  5. mapping 详解3(Meta-Fields)

    文档标识相关元数据字段 _index 当执行多索引查询时,可能需要添加特定的一些与文档有关联的索引的子句. _index 字段可以用在 term.terms 查询,聚合(aggregations)操作 ...

  6. js事件(Event)知识整理[转]

    事件注册 平常我们绑定事件的时候用dom.onxxxx=function(){}的形式 这种方式是给元素的onxxxx属性赋值,只能绑定有一个处理句柄. 但很多时候我们需要绑定多个处理句柄到一个事件上 ...

  7. Android Studio中文组(中文社区)

    Android Studio中文组(中文社区)http://www.android-studio.org/

  8. TortoiseGit记住用户名和密码

    1.将项目从服务器Clone下来 2.然后在Repository上右键,打开设置 3.选择凭证 4.为当前Repository创建一个凭证,然后确定退出即可 5.然后再pull下,会直接提示你输入密码 ...

  9. JAXB - Annotations, The Object Factory: XmlRegistry, XmlElementDecl

    To be able to create objects from XML elements, the unmarshaller must have an object factory with me ...

  10. Linux Shell脚本编程--cut命令

    cut cut命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符 [root@www ...