BZOJ 3434 [WC2014]时空穿梭 (莫比乌斯反演)
好难啊..反演的终极题目
首先,本题的突破口在于直线的性质。不论是几维的空间,两点一定能确定一条直线
选取两个点作为最左下和最右上的点!
假设现在是二维空间,选取了$(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]时空穿梭 (莫比乌斯反演)的更多相关文章
- 【BZOJ3434】[Wc2014]时空穿梭 莫比乌斯反演
[BZOJ3434][Wc2014]时空穿梭 Description Input 第一行包含一个正整数T,表示有T组数据求解每组数据包含两行,第一行包含两个正整数N,C(c>=2),分别表示空间 ...
- [WC2014]时空穿梭(莫比乌斯反演)
https://www.cnblogs.com/CQzhangyu/p/7891363.html 不难推到$\sum\limits_{D=1}^{m_1}\sum\limits_{d|D}C_{d-1 ...
- 【BZOJ】3434: [Wc2014]时空穿梭
http://www.lydsy.com/JudgeOnline/problem.php?id=3434 题意:n维坐标中要找c个点使得c个点在一条线上且每一维的坐标单调递增且不能超过每一维限定的值m ...
- UOJ 54 【WC2014】时空穿梭——莫比乌斯反演
题目:http://uoj.ac/problem/54 想写20分. Subtask 2 就是枚举4个维度的值的比例,可算对于一个比例有多少个值可以选,然后就是组合数.结果好像不对. 因为模数太小,组 ...
- [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)有多少对. ...
- UOJ#54 BZOJ3434 [WC2014]时空穿梭
题目描述 小 X 驾驶着他的飞船准备穿梭过一个 \(n\) 维空间,这个空间里每个点的坐标可以用 \(n\) 个实数表示,即 \((x_1,x_2,\dots,x_n)\). 为了穿过这个空间,小 X ...
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...
- BZOJ3434 [Wc2014]时空穿梭
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ 1114 Number theory(莫比乌斯反演+预处理)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=71738 题意:给你一个整数序列a1, a2, a3, ... , ...
随机推荐
- POJ 1106
先判断是否在圆内,然后用叉积判断是否在180度内.枚举判断就可以了... 感觉是数据弱了.. #include <iostream> #include <cstdio> #in ...
- cmd执行调用打开文件
Process p = new Process();//新进程 p.StartInfo.FileName = "cmd.exe";//打开cmd程序 p.StartInfo.Use ...
- Maven—Windows操作系统中安装配置Maven环境
今天难得的周末,借此难的机会总结一下关于maven的一些操作: 1.在安装maven之前要确认计算机已经安装并配置了JDK. 2.下载maven: maven-3.0.3:http://downloa ...
- cdev_init和register_chrdev区别
--- 01:include/linux/fs.h static inline int register_chrdev(unsigned int major, const char *name, co ...
- poj--2236--棋盘问题(dfs)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 31183 Accepted: 15469 Descriptio ...
- [JavaEE] Mybatis与Ibatis比较
随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis 虽然从正式版发布至今也有近一年时间,官方也非常友好的提供了中文版的使用手册,不过相信很多人还在项目中使用ibat ...
- jQuery右键菜单contextMenu实例
URL: http://www.cnblogs.com/whitewolf/archive/2011/09/28/2194795.html http://www.blogjava.net/superc ...
- Android之MVP架构
MVP(Model View Presenter)模式是由MVC模式发展而来的,在如今的Android程序开发中显得越来越重要.本篇文章简单讨论了MVP模式的思想. 啥是MVP MVP模式的主要思想是 ...
- 关于react-router-dom入门配置
react-router-dom入门配置 配置 参考:github https://reacttraining.com/react-router/web/api/BrowserRouter 1. 导入 ...
- 使用Word 2010群发邮件
1.建立数据库,这里我使用了excel 字段:电子邮件地址,名字 填写需要发送的数据 2.新建word文档,这里我使用了word2010 点击工具栏邮件 开始邮件合并,电子邮件 选择收件人,使用现有列 ...