http://codeforces.com/contest/235/problem/E

远距离orz......rng_58

证明可以见这里(可能要翻墙才能看到)

还是copy一下证明吧:

$$f(a,b,c)=\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}\sum\limits_{k=1}^{c}d(ijk)$$

$$g(a,b,c)=\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor$$

我们先证明下面的等式:

$f(a,b,c)-f(a-1,b,c)-f(a,b-1,c)-f(a,b,c-1)+f(a-1,b-1,c)+f(a-1,b,c-1)+f(a,b-1,c-1)-f(a-1,b-1,c-1)$

$=g(a,b,c)-g(a-1,b,c)-g(a,b-1,c)-g(a,b,c-1)+g(a-1,b-1,c)+g(a-1,b,c-1)+g(a,b-1,c-1)-g(a-1,b-1,c-1)$

根据容斥原理,我们容易知道

$$等式左边=d(abc)$$

我们继续化简一下等式右边(可能有点长,不过很好理解):

$g(a,b,c)-g(a-1,b,c)-g(a,b-1,c)-g(a,b,c-1)+g(a-1,b-1,c)+g(a-1,b,c-1)+g(a,b-1,c-1)-g(a-1,b-1,c-1)$

$=\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}(\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor-\left \lfloor \frac{a-1}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor-\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b-1}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor-\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c-1}{k} \right \rfloor+\left \lfloor \frac{a-1}{i} \right \rfloor\left \lfloor \frac{b-1}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor+\left \lfloor \frac{a-1}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c-1}{k} \right \rfloor+\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b-1}{j} \right \rfloor\left \lfloor \frac{c-1}{k} \right \rfloor-\left \lfloor \frac{a-1}{i} \right \rfloor\left \lfloor \frac{b-1}{j} \right \rfloor\left \lfloor \frac{c-1}{k} \right \rfloor)$

因式分解得:

$=\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}(\left \lfloor \frac{a}{i} \right \rfloor-\left \lfloor \frac{a-1}{i} \right \rfloor)(\left \lfloor \frac{b}{i} \right \rfloor-\left \lfloor \frac{b-1}{i} \right \rfloor)(\left \lfloor \frac{c}{i} \right \rfloor-\left \lfloor \frac{c-1}{i} \right \rfloor)$

容易知道,当且仅当$a\%i=0$时,$\left \lfloor \frac{a}{i} \right \rfloor-\left \lfloor \frac{a-1}{i} \right \rfloor=1$,其他时候为$0$。$\left \lfloor \frac{b}{i} \right \rfloor-\left \lfloor \frac{b-1}{i} \right \rfloor$和$\left \lfloor \frac{c}{i} \right \rfloor-\left \lfloor \frac{c-1}{i} \right \rfloor$也是如此。

很好,所以:

$$等式右边=|\{(i,j,k)|gcd(i,j)=gcd(j,k)=gcd(i,k)=1且a\%i=b\%j=c\%k=0\}|$$

$$(即满足gcd(i,j)=gcd(j,k)=gcd(i,k)=1且a\%i=b\%j=c\%k=0的三元组(i,j,k)的个数)$$

我们复习一下约数和定理:

记$P_i$为第$i$个质数,显然$P_1=2,P_2=3,P_3=5,P_4=7......$

对于质数$P_i$,记$x_i$是满足$a\%P_i^{x_i}=0$的最大数。类似地,记$y_i$是满足$b\%P_i^{y_i}=0$的最大数,记$z_i$是满足$c\%P_i^{z_i}=0$的最大数。

根据约数和定理,$d(abc)=\prod\limits_{i=1}^{oo}(x_i+y_i+z_i+1)$

我们回过头来看我们的等式的右边:

$$等式右边=|\{(i,j,k)|gcd(i,j)=gcd(j,k)=gcd(i,k)=1且a\%i=b\%j=c\%k=0\}|$$

$$(即满足gcd(i,j)=gcd(j,k)=gcd(i,k)=1且a\%i=b\%j=c\%k=0的三元组(i,j,k)的个数)$$

我们试着构造出这个集合。

我们先将三元组$(i,j,k)$中的$i,j,k$分别质因数分解:

$i=P_1^{i_1}\times P_2^{i_2}\times P_3^{i_3}\times P_4^{i_4}......$

$j=P_1^{j_1}\times P_2^{j_2}\times P_3^{j_3}\times P_4^{j_4}......$

$k=P_1^{k_1}\times P_2^{k_2}\times P_3^{k_3}\times P_4^{k_4}......$

我们先考虑$P_1和i,j,k的质因子P_1的幂P_1^{i_1},P_1^{j_1},P_1^{k_1}$

因为$gcd(i,j)=gcd(j,k)=gcd(i,k)=1且a\%i=b\%j=c\%k=0$

所以三元组$(i_1,j_1,k_1)$总共有$x_1+y_1+z_1+1$种:

$(0,0,0)$,有1种

$(1,0,0),(2,0,0),(3,0,0),...,(x_1,0,0)$,有$x_1$种

$(0,1,0),(0,2,0),(0,3,0),...,(0,y_1,0)$,有$y_1$种

$(0,0,1),(0,0,2),(0,0,3),...,(0,0,z_1)$,有$z_1$种

类似地,三元组$(i_2,j_2,k_2)$有$x_2+y_2+z_2+1$种,三元组$(i_3,j_3,k_3)$有$x_3+y_3+z_3+1$种......

根据乘法原理,所以恰好就是$\prod\limits_{i=1}^{oo}(x_i+y_i+z_i+1)$

又因为$等式左边=d(abc)=\prod\limits_{i=1}^{oo}(x_i+y_i+z_i+1)=等式右边$

所以

$f(a,b,c)-f(a-1,b,c)-f(a,b-1,c)-f(a,b,c-1)+f(a-1,b-1,c)+f(a-1,b,c-1)+f(a,b-1,c-1)-f(a-1,b-1,c-1)$

$=g(a,b,c)-g(a-1,b,c)-g(a,b-1,c)-g(a,b,c-1)+g(a-1,b-1,c)+g(a-1,b,c-1)+g(a,b-1,c-1)-g(a-1,b-1,c-1)$

很好,我们已经证明了这个等式了。

然后用简单的数学归纳法,我们可以得到

$$f(a,b,c)=g(a,b,c)$$

所以

$\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}\sum\limits_{k=1}^{c}d(ijk)=\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor$

好神奇。。。。。。

而且这东西还能推广到任意维:

$\sum\limits_{i=1}^{a}d(i)=\sum\limits_{}\left \lfloor \frac{a}{i} \right \rfloor$

$\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}d(ij)=\sum\limits_{gcd(i,j)=1}\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor$

$\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}\sum\limits_{k=1}^{c}d(ijk)=\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor$

......

先看一道题放松一下。

好,回到本题。

先介绍一种比较简单的超时的方法。

记$g(x,y)=\sum\limits_{i=1}^{x}\sum\limits_{j=1}^{y}d(ij)$

我们可以在$O(\sqrt{N})$的时间内完成。

记$s(n,r)=\sum\limits_{i=1}^{r}d(in)$

容易知道$s(n,r)=g(n,r)-g(n-1,r)$,所以也可以在$O(\sqrt{N})$的时间完成。

那么原问题就是:

$$\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}\sum\limits_{k=1}^{c}d(ijk)=\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}s(ij,c)$$

直接枚举$i$和$j$,然后算$s(ij,c)$,时间复杂度是$O(N^{\frac{5}{2}})$。

好吧,这种方法是超时。

2015.11.12

经过wck大神的提点,终于A这道题了。

$\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor$

$=\sum\limits_{i}\left \lfloor \frac{a}{i} \right \rfloor\sum\limits_{(i,j)=1}\sum\limits_{(i,k)=1}\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor[(j,k)==1]$

$=\sum\limits_{i}\left \lfloor \frac{a}{i} \right \rfloor\sum\limits_{(i,j)=1}\sum\limits_{(i,k)=1}\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor\sum\limits_{d|j,d|k}\mu (d)$

$=\sum\limits_{i}\left \lfloor \frac{a}{i} \right \rfloor\sum\limits_{d}\mu (d)\sum\limits_{d|j,(i,j)=1}\left \lfloor \frac{b}{j} \right \rfloor \sum\limits_{d|k,(i,k)=1}\left \lfloor \frac{c}{k} \right \rfloor$

$记j=dj',k=dk',则:$

$\sum\limits_{i}\left \lfloor \frac{a}{i} \right \rfloor\sum\limits_{d}\mu (d)\sum\limits_{(i,dj')=1}\left \lfloor \frac{b}{dj'} \right \rfloor \sum\limits_{(i,dk')=1}\left \lfloor \frac{c}{dk'} \right \rfloor$

我们先枚举$i$和$d$,然后分别枚举求$\sum\limits_{(i,dj')=1}\left \lfloor \frac{b}{dj'} \right \rfloor$ 和 $\sum\limits_{(i,dk')=1}\left \lfloor \frac{c}{dk'} \right \rfloor$,我们枚举的次数只是是$b/d$和$c/d$

所以其实计算的次数只是$a*(b/1+b/2+...+b/b)<ablogb$,不超时。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. #include<fstream>
  5. #include<algorithm>
  6. #include<cstring>
  7. #include<string>
  8. #include<cmath>
  9. #include<queue>
  10. #include<stack>
  11. #include<map>
  12. #include<utility>
  13. #include<set>
  14. #include<bitset>
  15. #include<vector>
  16. #include<functional>
  17. #include<deque>
  18. #include<cctype>
  19. #include<climits>
  20. #include<complex>
  21. //#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj
  22.  
  23. using namespace std;
  24.  
  25. typedef long long LL;
  26. typedef double DB;
  27. typedef pair<int,int> PII;
  28. typedef complex<DB> CP;
  29.  
  30. #define mmst(a,v) memset(a,v,sizeof(a))
  31. #define mmcy(a,b) memcpy(a,b,sizeof(a))
  32. #define fill(a,l,r,v) fill(a+l,a+r+1,v)
  33. #define re(i,a,b) for(i=(a);i<=(b);i++)
  34. #define red(i,a,b) for(i=(a);i>=(b);i--)
  35. #define ire(i,x) for(typedef(x.begin()) i=x.begin();i!=x.end();i++)
  36. #define fi first
  37. #define se second
  38. #define m_p(a,b) make_pair(a,b)
  39. #define p_b(a) push_back(a)
  40. #define SF scanf
  41. #define PF printf
  42. #define two(k) (1<<(k))
  43.  
  44. template<class T>inline T sqr(T x){return x*x;}
  45. template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
  46. template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}
  47.  
  48. inline int sgn(DB x){if(abs(x)<1e-)return ;return(x>)?:-;}
  49. const DB Pi=acos(-1.0);
  50.  
  51. int gint()
  52. {
  53. int res=;bool neg=;char z;
  54. for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
  55. if(z==EOF)return ;
  56. if(z=='-'){neg=;z=getchar();}
  57. for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
  58. return (neg)?-res:res;
  59. }
  60. LL gll()
  61. {
  62. LL res=;bool neg=;char z;
  63. for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
  64. if(z==EOF)return ;
  65. if(z=='-'){neg=;z=getchar();}
  66. for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
  67. return (neg)?-res:res;
  68. }
  69.  
  70. const int maxn=;
  71. const LL MOD=;
  72.  
  73. int a,b,c;
  74. LL ans;
  75.  
  76. int flag[maxn+],cnt,prime[maxn+],mul[maxn+];
  77. void prepare(int n)
  78. {
  79. int i,j;
  80. flag[]=;mul[]=;
  81. re(i,,n)
  82. {
  83. if(!flag[i])prime[++cnt]=i,mul[i]=-;
  84. for(j=;j<=cnt && prime[j]*i<=n;j++)
  85. {
  86. flag[prime[j]*i]=;
  87. if(i%prime[j]==){mul[i*prime[j]]=;break;}else mul[i*prime[j]]=-mul[i];
  88. }
  89. }
  90. }
  91.  
  92. int gcd(int a,int b){return b==?a:gcd(b,a%b);}
  93.  
  94. int main()
  95. {
  96. freopen("CF235E.in","r",stdin);
  97. freopen("CF235E.out","w",stdout);
  98. int i;
  99. a=gint();b=gint();c=gint();
  100. if(b<c)swap(b,c);
  101. prepare(b);
  102. int d,jp,kp;
  103. re(i,,a)
  104. re(d,,b)if(mul[d]!= && gcd(i,d)==)
  105. {
  106. LL rj=,rk=;
  107. for(jp=;d*jp<=b;jp++)if(gcd(i,jp)==)(rj+=b/(d*jp))&=(MOD-);
  108. for(kp=;d*kp<=c;kp++)if(gcd(i,kp)==)(rk+=c/(d*kp))&=(MOD-);
  109. LL res=(a/i);
  110. (res*=mul[d])&=(MOD-);
  111. (res*=rj)&=(MOD-);
  112. (res*=rk)&=(MOD-);
  113. (ans+=res)&=(MOD-);
  114. }
  115. cout<<ans<<endl;
  116. return ;
  117. }

Codeforces 235E Number Challenge的更多相关文章

  1. Codeforces 235E. Number Challenge DP

    dp(a,b,c,p) = sigma ( dp(a/p^i,b/p^j,c/p^k) * ( 1+i+j+k) ) 表示用小于等于p的素数去分解的结果有多少个 E. Number Challenge ...

  2. CodeForces 235E Number Challenge (莫比乌斯反演)

    题意:求,其中d(x) 表示 x 的约数个数. 析:其实是一个公式题,要知道一个结论 知道这个结论就好办了. 然后就可以解决这个问题了,优化就是记忆化gcd. 代码如下: #pragma commen ...

  3. CF#235E. Number Challenge

    传送门 可以理解为上一道题的扩展板.. 然后我们就可以YY出这样一个式子 ${\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^cd(ijk)=\sum_{i=1}^a\sum_{ ...

  4. Easy Number Challenge(暴力,求因子个数)

    Easy Number Challenge Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I ...

  5. Codeforces 235E

    Codeforces 235E 原题 题目描述:设\(d(n)\)表示\(n\)的因子个数, 给定\(a, b, c\), 求: \[\sum_{i=1}^{a} \sum_{j=1}^{b} \su ...

  6. Codeforces Avito Code Challenge 2018 D. Bookshelves

    Codeforces Avito Code Challenge 2018 D. Bookshelves 题目连接: http://codeforces.com/contest/981/problem/ ...

  7. 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]CF-236B. Easy Number Challenge

    B. Easy Number Challenge time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  8. Java实现 蓝桥杯 算法训练 Number Challenge(暴力)

    试题 算法训练 Number Challenge 资源限制 时间限制:3.0s 内存限制:512.0MB 问题描述 定义d(n)为n的约数个数.现在,你有三个数a,b,c.你的任务是计算下面式子mod ...

  9. 【codeforces 235E】 Number Challenge

    http://codeforces.com/problemset/problem/235/E (题目链接) 题意 给出${a,b,c}$,求${\sum_{i=1}^a\sum_{j=1}^b\sum ...

随机推荐

  1. 《火球——UML大战需求分析》(第1章 大话UML)——1.4 如何学好UML?

    说明: <火球——UML大战需求分析>是我撰写的一本关于需求分析及UML方面的书,我将会在CSDN上为大家分享前面几章的内容,总字数在几万以上,图片有数十张.欢迎你按文章的序号顺序阅读,谢 ...

  2. 更改Zend Studio/Eclipse代码风格主题

    最近决定把几个IDE的代码样式统一一下,Visual Studio的还算好改,PHP目前用得不多,不过也打算给Zend Studio换身新装. 网上搜索的一些更改Zend Studio主题的多是修改或 ...

  3. 【转】prufer编码

    既然有人提到了,就顺便学习一下吧,来源:http://greatkongxin.blog.163.com/blog/static/170097125201172483025666/ 一个含有n个点的完 ...

  4. sql循环遍历

    <sql id="Example_Where_Clause" > <!-- WARNING - @mbggenerated This element is aut ...

  5. css06背景图片

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. UWP APP 开发日记

    最近需要使用C#开发UWP应用,以前学习过C,这回就是快速看了一下C#的一些特别之处,然后就进入到了实战练习当中. 1.按照MSDN的教程自己搭建了一个简单的“Hello, world”应用.是使用C ...

  7. ASP.NET 页面间数据传递的方法

    在做WEB开发时,很多地方会涉及到页面间的数据传递.这几天在完善教务基础系统,遇到了这个问题,上网查了一些资料,现总结如下: 说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是 ...

  8. shell 中 2>&1 的使用

    一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |). 2)默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(backquotes ` ...

  9. [<DDGuessYouLIkeModel 0x7c99faf0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key star.

    出现这个提示是由于以下原因造成: 这里我用到了MJExtension将字典转为模型,但再转为模型的时候,出现这个提示,原因就是因为NSInteger后面多一个一个“*” @property (nona ...

  10. C程序第二章节:算法

    1.主要讲了:算法,3种基本结构化的算法(顺序,选择,循环结构),N-S流程图表示算法,伪代码表示算法. 2.输入10个数,输出其中最大的一个数. #include <stdio.h>in ...