题面: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过了,懒得优化了

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define N1 100100
using namespace std;
const int inf=0x3f3f3f3f; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
const int zwz=;
int qpow(int x,int y)
{
int ans=;
for(;y;x=x*x%zwz,y>>=) if(y&) ans=ans*x%zwz;
return ans;
} int T,n,c,cnt;
int mu[N1],pr[N1],use[N1], f[][N1][],m[N1],C[N1][],mul[N1],_mul[N1];
int maxn=;
int Lucas(int a,int b)
{
if(b>a) return ;
if(a<zwz&&b<zwz) return mul[a]*_mul[b]%zwz*_mul[a-b]%zwz;
else return Lucas(a%zwz,b%zwz)*Lucas(a/zwz,b/zwz)%zwz;
}
void Pre()
{
int i,j,k,l;
mu[]=;
for(i=;i<=maxn;i++)
{
if(!use[i]) pr[++cnt]=i,mu[i]=-;
for(j=;(j<=cnt)&&(i*pr[j]<=maxn);j++)
{
use[i*pr[j]]=;
if(i%pr[j]) mu[i*pr[j]]=-mu[i];
else mu[i*pr[j]]=;
}
}
mul[]=mul[]=_mul[]=_mul[]=;
for(i=;i<zwz;i++)
{
mul[i]=mul[i-]*i%zwz;
_mul[i]=qpow(mul[i],zwz-);
}
for(i=;i<=maxn;i++) for(k=;k<=min(i,);k++)
C[i][k]=Lucas(i,k);
for(i=;i<=maxn;i++) for(j=i;j<=maxn;j+=i)
{
for(k=;k<=;k++)
(f[][j][k]+=C[i-][k-]*mu[j/i]%zwz+zwz)%=zwz;
}
for(l=;l<=;l++) for(i=;i<=maxn;i++) for(k=;k<=;k++) f[l][i][k]=i*f[l-][i][k]%zwz;
for(l=;l<=;l++) for(i=;i<=maxn;i++) for(k=;k<=;k++) (f[l][i][k]+=f[l][i-][k])%=zwz;
}
int p[][]; int main()
{
scanf("%d",&T);
int i,la,j,x,y,k,t,mi,ans,tmp,inv2,now,pst;// ll ans=0;
Pre();
for(t=;t<=T;t++){ scanf("%d%d",&n,&c); ans=; inv2=qpow(,zwz-);
for(i=,mi=inf;i<=n;i++) m[i]=gint(), mi=min(mi,m[i]);
for(i=;i<=mi;i=la+)
{
for(j=,la=inf;j<=n;j++) la=min(la,m[j]/(m[j]/i));
memset(p,,sizeof(p)); now=; pst=; p[pst][]=;
for(j=;j<=n;j++)
{
memset(p[now],,sizeof(p[now]));
for(k=;k<n;k++)
p[now][k+]=(p[now][k+]-p[pst][k]*(+m[j]/i)%zwz*(m[j]/i)%zwz*inv2%zwz+zwz)%zwz,
p[now][k]=(p[now][k]+p[pst][k]*(m[j]/i)%zwz*m[j])%zwz;
swap(now,pst);
}
for(k=;k<=n;k++)
ans=(ans+p[pst][k]*(f[k][la][c]-f[k][i-][c]+zwz)%zwz)%zwz;
}
printf("%d\n",ans); }
return ;
}

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. 0708关于理解mysql SQL执行顺序

    转自 http://www.jellythink.com/archives/924,博客比价清晰 我理解上文的是SQL执行顺序 总体方案.当你加入索引了以后,其实他的执行计划是有细微的变化,比方说刚开 ...

  2. Ngnix--知识点

    ngnix擅长负载 均衡的反向代理 haproxy擅长高可用的反向代理,这个还支持TCP协议 ngnix只能支持HTTP和Email(这个HTTPS需要核实一下) ngnix和haproxy都需要ke ...

  3. mongodb-主从复制

    1 主从复制: 一个概念,在sqlserver或者说是mysql也有 2 主从复制解决了哪些问题??? 读写压力:以前是一个mongodb去承载海量的读和写,这样的话终有瓶颈的.使用一主多从, 从服务 ...

  4. iOS快速打企业包ipa

    简 首页 专题 发钱啦 注册 登录 简首页专题下载手机应用 gege 2016.01.19 16:55 写了24604字,被92人关注,获得了152个喜欢 iOS快速打企业包ipa 字数256 阅读1 ...

  5. 学习Mockito - Mockito对Annotation的支持

    学习Mockito - Mockito对Annotation的支持 博客分类: test junit工作  Mockito支持对变量进行注解,例如将mock对象设为测试类的属性,然后通过注解的方式@M ...

  6. HDU 5308 I Wanna Become A 24-Point Master

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5308 题面: I Wanna Become A 24-Point Master Time Limit ...

  7. insert into 语句的三种写法 以及批量插入

    方式1. INSERT INTO t1(field1,field2) VALUE(v001,v002);            // 插入一条 方式2. INSERT INTO t1(field1,f ...

  8. C - Twins(贪心)

    Problem description Imagine that you have a twin brother or sister. Having another person that looks ...

  9. MSDN性能分析相关网站收集

    Visual Studio 性能分析初学者指南 | Microsoft Docshttps://docs.microsoft.com/zh-cn/visualstudio/profiling/begi ...

  10. [Offer收割]编程练习赛37

    热门号码 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> ...