题面:BZOJ传送门 洛谷传送门

好难啊..反演的终极题目

首先,本题的突破口在于直线的性质。不论是几维的空间,两点一定能确定一条直线

选取两个点作为最左下和最右上的点!

假设现在是二维空间,选取了$(x1,y1)$和$(x2,y2)$两个点,那么它们连线上经过的点数就是$gcd(x2-x1,y2-y1)-1$

选取的方案数为$\left ( _{gcd-1}^{c-2} \right )$

发现这个方案数只和坐标的差值有关,我们直接枚举差值就行

接下来就是反演了,为了方便叙述,以$n=2$为例

$\sum\limits_{x=1}^{m_{1}}\sum\limits_{y=1}^{m_{2}} \left ( _{c-2}^{gcd(x,y)-1} \right ) (m_{1}-x)(m_{2}-y)$

$\sum\limits_{k=1}^{m} \left ( _{c-2}^{k-1} \right ) \sum\limits_{x=1}^{m_{1}} \sum\limits_{y=1}^{m_{2}} [gcd(x,y)==k] (m_{1}-x)(m_{2}-y)$

$\sum\limits_{k=1}^{m} \left ( _{c-2}^{k-1} \right ) \sum\limits_{x=1}^{\left \lfloor \frac{m_{1}}{k} \right \rfloor} \sum\limits_{y=1}^{\left \lfloor \frac{m_{2}}{k} \right \rfloor} [gcd(x,y)==1] (m_{1}-xk)(m_{2}-yk)$

$\sum\limits_{k=1}^{m} \left ( _{c-2}^{k-1} \right ) \sum\limits_{x=1}^{\left \lfloor \frac{m_{1}}{k} \right \rfloor} \sum\limits_{y=1}^{\left \lfloor \frac{m_{2}}{k} \right \rfloor} \sum\limits_{d|k}\mu(d)(m_{1}-xk)(m_{2}-yk)$

$\sum\limits_{k=1}^{m} \left ( _{c-2}^{k-1} \right ) \sum\limits_{d=1}^{\left \lfloor \frac{m_{1}}{k} \right \rfloor} \mu(d) \sum\limits_{x=1}^{\left \lfloor \frac{m_{1}}{kd} \right \rfloor} (m_{1}-xkd) \sum\limits_{y=1}^{ \left \lfloor \frac{m_{2}}{kd} \right \rfloor} (m_{2}-ykd)$

令$Q=kd$

$\sum\limits_{Q=1}^{m}   \left ( \sum\limits_{k|Q} \left ( _{c-2}^{k-1} \right ) \mu(\frac{Q}{k}) \right )   \left ( \sum\limits_{x=1}^{\left \lfloor \frac{m_{1}}{Q} \right \rfloor} (m_{1}-xQ) \right ) \left ( \sum\limits_{y=1}^{ \left \lfloor \frac{m_{2}}{Q} \right \rfloor} (m_{2}-yQ) \right ) $

利用等差数列公式 $\left ( \sum\limits_{x=1}^{\left \lfloor \frac{m}{Q} \right \rfloor} (m-xQ) \right ) = \left ( \left \lfloor \frac{m}{Q} \right \rfloor m- \frac{ (1+\left \lfloor \frac{m}{Q} \right \rfloor )\left \lfloor \frac{m}{Q} \right \rfloor Q}{2} \right ) $

$\sum\limits_{Q=1}^{m}   \left ( \sum\limits_{k|Q} \left ( _{c-2}^{k-1} \right ) \mu(\frac{Q}{k}) \right )   \left ( \left \lfloor \frac{m_{1}}{Q} \right \rfloor m_{1}- \frac{ (1+\left \lfloor \frac{m_{1}}{Q} \right \rfloor )\left \lfloor \frac{m_{1}}{Q} \right \rfloor Q}{2} \right ) \left ( \left \lfloor \frac{m_{2}}{Q} \right \rfloor m_{2}- \frac{ (1+\left \lfloor \frac{m_{2}}{Q} \right \rfloor )\left \lfloor \frac{m_{2}}{Q} \right \rfloor Q}{2} \right ) $

推广到更高维上

$\sum\limits_{Q=1}^{m}   \left ( \sum\limits_{k|Q} \left ( _{c-2}^{k-1} \right ) \mu(\frac{Q}{k}) \right )  \prod_{t=1}^{n} \left ( \left \lfloor \frac{m_{t}}{Q} \right \rfloor m_{t}- \frac{ (1+\left \lfloor \frac{m_{t}}{Q} \right \rfloor )\left \lfloor \frac{m_{t}}{Q} \right \rfloor Q}{2} \right ) $

我们不能把$Q$这一项带入到整除分块里去

所以每次$O(n^{2})$暴力计算出$Q^{k}(k=0,1,2...n)$的系数

预处理出$f(Q,c)=\sum\limits_{k|Q} \left ( _{c-2}^{k-1} \right ) Q^{u}$

用整除分块即可

时间$O(Tn^{3}\sqrt {m})$

人傻常数大,BZOJ过不去,洛谷上开O2过了,懒得优化了

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #define ll long long
  5. #define N1 100100
  6. using namespace std;
  7. const int inf=0x3f3f3f3f;
  8.  
  9. int gint()
  10. {
  11. int ret=,fh=;char c=getchar();
  12. while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
  13. while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
  14. return ret*fh;
  15. }
  16. const int zwz=;
  17. int qpow(int x,int y)
  18. {
  19. int ans=;
  20. for(;y;x=x*x%zwz,y>>=) if(y&) ans=ans*x%zwz;
  21. return ans;
  22. }
  23.  
  24. int T,n,c,cnt;
  25. int mu[N1],pr[N1],use[N1], f[][N1][],m[N1],C[N1][],mul[N1],_mul[N1];
  26. int maxn=;
  27. int Lucas(int a,int b)
  28. {
  29. if(b>a) return ;
  30. if(a<zwz&&b<zwz) return mul[a]*_mul[b]%zwz*_mul[a-b]%zwz;
  31. else return Lucas(a%zwz,b%zwz)*Lucas(a/zwz,b/zwz)%zwz;
  32. }
  33. void Pre()
  34. {
  35. int i,j,k,l;
  36. mu[]=;
  37. for(i=;i<=maxn;i++)
  38. {
  39. if(!use[i]) pr[++cnt]=i,mu[i]=-;
  40. for(j=;(j<=cnt)&&(i*pr[j]<=maxn);j++)
  41. {
  42. use[i*pr[j]]=;
  43. if(i%pr[j]) mu[i*pr[j]]=-mu[i];
  44. else mu[i*pr[j]]=;
  45. }
  46. }
  47. mul[]=mul[]=_mul[]=_mul[]=;
  48. for(i=;i<zwz;i++)
  49. {
  50. mul[i]=mul[i-]*i%zwz;
  51. _mul[i]=qpow(mul[i],zwz-);
  52. }
  53. for(i=;i<=maxn;i++) for(k=;k<=min(i,);k++)
  54. C[i][k]=Lucas(i,k);
  55. for(i=;i<=maxn;i++) for(j=i;j<=maxn;j+=i)
  56. {
  57. for(k=;k<=;k++)
  58. (f[][j][k]+=C[i-][k-]*mu[j/i]%zwz+zwz)%=zwz;
  59. }
  60. for(l=;l<=;l++) for(i=;i<=maxn;i++) for(k=;k<=;k++) f[l][i][k]=i*f[l-][i][k]%zwz;
  61. for(l=;l<=;l++) for(i=;i<=maxn;i++) for(k=;k<=;k++) (f[l][i][k]+=f[l][i-][k])%=zwz;
  62. }
  63. int p[][];
  64.  
  65. int main()
  66. {
  67. scanf("%d",&T);
  68. int i,la,j,x,y,k,t,mi,ans,tmp,inv2,now,pst;// ll ans=0;
  69. Pre();
  70. for(t=;t<=T;t++){
  71.  
  72. scanf("%d%d",&n,&c); ans=; inv2=qpow(,zwz-);
  73. for(i=,mi=inf;i<=n;i++) m[i]=gint(), mi=min(mi,m[i]);
  74. for(i=;i<=mi;i=la+)
  75. {
  76. for(j=,la=inf;j<=n;j++) la=min(la,m[j]/(m[j]/i));
  77. memset(p,,sizeof(p)); now=; pst=; p[pst][]=;
  78. for(j=;j<=n;j++)
  79. {
  80. memset(p[now],,sizeof(p[now]));
  81. for(k=;k<n;k++)
  82. p[now][k+]=(p[now][k+]-p[pst][k]*(+m[j]/i)%zwz*(m[j]/i)%zwz*inv2%zwz+zwz)%zwz,
  83. p[now][k]=(p[now][k]+p[pst][k]*(m[j]/i)%zwz*m[j])%zwz;
  84. swap(now,pst);
  85. }
  86. for(k=;k<=n;k++)
  87. ans=(ans+p[pst][k]*(f[k][la][c]-f[k][i-][c]+zwz)%zwz)%zwz;
  88. }
  89. printf("%d\n",ans);
  90.  
  91. }
  92. return ;
  93. }

BZOJ 3434 [WC2014]时空穿梭 (莫比乌斯反演)的更多相关文章

  1. 【BZOJ3434】[Wc2014]时空穿梭 莫比乌斯反演

    [BZOJ3434][Wc2014]时空穿梭 Description Input 第一行包含一个正整数T,表示有T组数据求解每组数据包含两行,第一行包含两个正整数N,C(c>=2),分别表示空间 ...

  2. [WC2014]时空穿梭(莫比乌斯反演)

    https://www.cnblogs.com/CQzhangyu/p/7891363.html 不难推到$\sum\limits_{D=1}^{m_1}\sum\limits_{d|D}C_{d-1 ...

  3. 【BZOJ】3434: [Wc2014]时空穿梭

    http://www.lydsy.com/JudgeOnline/problem.php?id=3434 题意:n维坐标中要找c个点使得c个点在一条线上且每一维的坐标单调递增且不能超过每一维限定的值m ...

  4. UOJ 54 【WC2014】时空穿梭——莫比乌斯反演

    题目:http://uoj.ac/problem/54 想写20分. Subtask 2 就是枚举4个维度的值的比例,可算对于一个比例有多少个值可以选,然后就是组合数.结果好像不对. 因为模数太小,组 ...

  5. [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)

    [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...

  6. UOJ#54 BZOJ3434 [WC2014]时空穿梭

    题目描述 小 X 驾驶着他的飞船准备穿梭过一个 \(n\) 维空间,这个空间里每个点的坐标可以用 \(n\) 个实数表示,即 \((x_1,x_2,\dots,x_n)\). 为了穿过这个空间,小 X ...

  7. Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...

  8. BZOJ3434 [Wc2014]时空穿梭

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  9. BZOJ 1114 Number theory(莫比乌斯反演+预处理)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=71738 题意:给你一个整数序列a1, a2, a3, ... , ...

随机推荐

  1. 0622 CentOS 6.4下编译安装MySQL 5.6.14

    转自http://www.cnblogs.com/xiongpq/p/3384681.html 概述: CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版 ...

  2. 【ACM】hdu_1170_Balloon Comes!_201307261946

    Balloon Comes!Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  3. Seaside HDU 3665 【Dijkstra】

    Problem Description XiaoY is living in a big city, there are N towns in it and some towns near the s ...

  4. 当前插入的线段能完整覆盖存在的几条线段 树状数组 HDU 5372 Segment Game

    http://acm.hdu.edu.cn/showproblem.php? pid=5372 Segment Game Time Limit: 3000/1500 MS (Java/Others)  ...

  5. js导出table中的EXCEL总结

    导出EXCEL通常是用PHP做,可是项目中,有时候PHP后端project师返回的数据不是我们想要的,作为前端开发project师,把相应的数据编号转换为文字后,展示给用户.可是.需求要把数据同一时候 ...

  6. 我是这样记录javascript知识的------Day31

    在陆续研究了几个javascript的几个小应用后,也算对javascript有了更深一点的认识,头脑中大约都有些印象,总体上说却有些模糊,这时.我知道,是时候看看w3cshool的这部分介绍了. 没 ...

  7. Jemeter第一个实例

    http://www.jianshu.com/p/0e4daecc8122?from=timeline&isappinstalled=0 学习地址:http://leafwf.blog.51c ...

  8. Java读源代码学设计模式:适配器Adapter

    适配器模式相关源代码:slf4j-1.6.1.hibernate-3.6.7 大家都知道.log4j是一个广泛使用的日志工具,除此之外.sun公司在JDK中也有自己的日志工具,也就是java.util ...

  9. actionbarsherlock示例

    package com.example.viewpagerandtabdemo; import java.util.ArrayList; import java.util.List; import a ...

  10. Mysql数据库性能

    Mysql数据库设计规范 https://www.cnblogs.com/Luke-Me/p/8994432.html 我们在项目一开始的设计中,就要忙着考虑数据库的设计,表.字段.索引.sql等等, ...