这才叫莫比乌斯反演题。

一、题目

点此看题

二、解法

也没有什么好的思路,我们不妨把暴力柿子写出来,我们想枚举直线,但是这道题不能枚举直线的斜率,所以就要用整数来表示直线,我们不妨枚举出发点和终止点的向量差 \((x_1,x_2...x_n)\) ,那么起始点的方案数就是 \(\prod m-x_i\) ,剩余点的选取是在起始点的基础上加上这个向量 \((x_1/d,x_2/d...x_n/d)\) ,不难发现 \(d\) 必然满足是所有 \(x\) 的因数,也就是 \(\gcd(x)\) 的因数( \(d=0\) 也可以),所以直线上的点都是可以选的,由于已经确定了起终点,所以选剩下点的方案数是 \({\gcd(x)-1\choose c-2}\) ,写成柿子:

\[\sum_{1\leq x_i\leq m_i}{\gcd(x)-1\choose c-2}\prod_{i=1}^n(m-x_i)
\]

看到 \(\gcd\) 的柿子就一定要想莫比乌斯反演,我觉得网上的推导都不是很好,这种题是有套路的,按照我给的方法去推一定推得出来。第一步,我们在最前面枚举 \(\gcd(x)\) ,那么柿子变成这样:

\[\sum_{d=1}^{\min m} C(d-1,c-2)\sum_{1\leq x_i\leq m_i/d}[\gcd(x)=1]\prod_{i=1}^n(m_i-x_id)
\]

第二步,把 \([\gcd(x)=1]\) 反演了,很多题都只需要反演这种结构:

\[\sum_{d=1}^{\min m} C(d-1,c-2)\sum_{1\leq x_i\leq m_i/d}\sum_{j|\gcd(x)}\mu(j)\prod_{i=1}^n(m_i-x_id)
\]

第三步,由于 \(\mu\) 的求和结构放在里面很不舒服,我们把它提前,本题我们放在最外层求和的后边:

\[\sum_{d=1}^{\min m}C(d-1,c-2)\sum_{j}\mu(j)\sum_{1\leq x_i\leq m_i/dj}\prod_{i=1}^n(m-x_idj)
\]

第四步,你发现出现 \(dj\) 这个整体结构,于是令 \(d=dj\) 结构一定会更简单(注意 \(d\) 的含义不同):

\[\sum_{d=1}^{\min m}\sum_{d'|d}C(d'-1,c-2)\mu(\frac{d}{d'})\sum_{1\leq x_i\leq m_i/d}\prod_{i=1}^n(m_i-x_id)
\]

设 \(g(n)=\sum_{d|n}C(d-1,c-2)\mu(\frac{n}{d})\) 那么预处理 \(g\) 是需要 \(O(nc\log m)\) 的时间的(对于每一种可能的 \(c\) 我们都预处理),后面那一大块可以用乘法原理化简,那么柿子变成了这个样子:

\[\sum_{d=1}^{\min m}g(d)\prod_{i=1}^n(\sum_{x_i=1}^{m_i/d} m_i-x_id)
\]

暴力算他是 \(O(Tnm)\) 的,\(1e8\) 还是过不了,注意到出现了 \(m_i-x_id\) 这种结构,\(d\) 又是在前面枚举的,你难道对这个结构没有感觉吗?noip2020微信步数考过的啊!我们把 \(d\) 看成未知数,那么后面的那一块就可以变成一个关于 \(d\) 的多项式,对于 \(m_i/d\) 相同的那些 \(d\) ,他们的多项式是相同的,所以可以把前面改成一个分块,我们把它的系数给整出来,设系数为 \(dp_i\) ,\(d\in[l,r]\) 则柿子变为:

\[\sum_{d=l}^rg(d)\sum_{i=0}^n dp_i\times d^i
\]

那么把 \(dp_i\) 放在前面去枚举:

\[\sum_{i=0}^ndp_i\sum_{d=l}^rd^i\times g(d)
\]

后面的那部分相当于是一个前缀和,显然是可以预处理,预处理的数据要加上 \(n\) 的那维所以时间复杂度 \(O(cnm)\) ,现在来想一下算系数的复杂度,一共有 \(O(n\sqrt m)\) 个块(要保证 \(m_i/d\) 的值相同嘛),然后每个块的系数要 \(O(n^2)\) 去算,那么复杂度是 \(O(n^3\sqrt m)\) 的,\(n\) 特别小所以没关系。补充一种大佬的做法,由于系数是很多个 \(1\) 次多项式相乘来算的,根据分块的原理每次在端点处做退背包,这样做就可以优化到 \(O(n^2\sqrt m)\) (但是我太懒了没写)

然后计算一下分块的复杂度是 \(O(n^2\sqrt m)\) 的,所以我们就过掉了这道题!但是由于模数是 \(10007\) 所以算组合数要用杨辉三角哦,思路理清楚了写起来就不麻烦了!

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 21;
const int M = 100005;
const int MOD = 10007;
int read()
{
int x=0,f=1;char c;
while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
int T,n,m[M],c,up,ans,dp[N];
int cnt,mu[M],vis[M],p[M],C[M][N],g[M][N],sum[M][N][12];
void init(int n)
{
//算组合数
C[0][0]=1;
for(int i=1;i<=n;i++)
{
C[i][0]=1;
for(int j=1;j<20;j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
}
//欧拉筛
mu[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
p[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt && i*p[j]<=n;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0) break;
mu[i*p[j]]=-mu[i];
}
}
//算g
for(int c=2;c<=20;c++)
{
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j+=i)
g[j][c]=(g[j][c]+C[i-1][c-2]*mu[j/i])%MOD;
}
}
//算sum,也就是g(n,c)*n^k
for(int i=1;i<=n;i++)
for(int c=2;c<=20;c++)
{
int pw=1;
for(int k=0;k<=11;k++)
{
sum[i][c][k]=(sum[i-1][c][k]+g[i][c]*pw)%MOD;
pw=pw*i%MOD;
}
}
}
void work(int d)//算系数 -x_i*d+m_i
{
memset(dp,0,sizeof dp);dp[0]=1;
for(int i=1;i<=n;i++)
{//1-mi/d
int t=m[i]/d,x=-1ll*(t+1)*t/2%MOD,y=1ll*m[i]*t%MOD;
for(int j=i;j>=1;j--)
dp[j]=(dp[j]*y+dp[j-1]*x)%MOD;
dp[0]=dp[0]*y%MOD;//surprise!
}
}
void solve()
{
n=read();c=read();up=1e5;ans=0;
for(int i=1;i<=n;i++)
{
m[i]=read();
up=min(up,m[i]);
}
for(int l=1,r;l<=up;l=r+1)
{
r=1e5;
for(int i=1;i<=n;i++)
r=min(r,m[i]/(m[i]/l));
work(l);
for(int i=0;i<=n;i++)
ans=(ans+dp[i]*(sum[r][c][i]-sum[l-1][c][i]))%MOD;
}
printf("%d\n",(ans+MOD)%MOD);
}
signed main()
{
init(100000);
T=read();
while(T--)
{
solve();
}
}

[WC2014]时空穿梭的更多相关文章

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

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

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

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

  3. BZOJ3434 [Wc2014]时空穿梭

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

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

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

  5. BZOJ3434 WC2014时空穿梭(莫比乌斯反演)

    考虑枚举相邻点距离差的比例.显然应使比例值gcd为1以保证不重复统计.确定比例之后,各维坐标的方案数就可以分开考虑.设比例之和为k,则若坐标上限为m,该维坐标取值方案数即为Σm-ki (i=1~⌊m/ ...

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

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

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

    题面:BZOJ传送门 洛谷传送门 好难啊..反演的终极题目 首先,本题的突破口在于直线的性质.不论是几维的空间,两点一定能确定一条直线 选取两个点作为最左下和最右上的点! 假设现在是二维空间,选取了$ ...

  8. Vue2 实现时空穿梭框功能模块

    前言 这篇文章主要是分享一个时空穿梭框功能,也就是我们平时用的选择功能.勾选了的项就会进入到另一个框中. 时空穿梭框之旅 示例演示: 这个时空穿梭框实现了: 1.可以全选.反选 2.没有选中时,不可以 ...

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

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

随机推荐

  1. [整理] LRU 算法的实现方式

    目录 概念 方法选择 实现方案(基于LinkedHashMap) 改进方案 1.LRU-K 2.Two queue 3.Multi Queue(MQ) LRU类算法对比 LRU 在 Redis 中的应 ...

  2. hdu-1941 Find the Shortest Common Superstring

    The shortest common superstring of 2 strings S 1 and S 2 is a string S with the minimum number of ch ...

  3. LOJ6285 数列分块入门9(分块 区间众数)题解

    题意:给出区间内的最小众数 思路:分块,离散化每个数,开vector记录每个数p出现的位置,这样就能二分出L,R以内p的个数了.众数有一个性质,用mode(a)表示集合a的众数,那么mode(a∪b) ...

  4. Docker下载Mysql 2059

    接着我上一篇的,在我们安装好docker后我们尝试在docker里面安装mysql并连接使用 正式开始 1.启动docker 2.打开Windows PowerShell(执行下载命令) `docke ...

  5. Windows 10 Emoji shortcuts

    Windows 10 Emoji shortcuts Windows 10 Emoji 快捷方式 https://support.microsoft.com/en-us/windows/windows ...

  6. JS Object Deep Copy & 深拷贝

    JS Object Deep Copy & 深拷贝 针对深度拷贝,需要使用其他方法 JSON.parse(JSON.stringify(obj));,因为 Object.assign() 拷贝 ...

  7. random array & shuffle 洗牌算法 / 随机算法

    random array & shuffle shuffle 洗牌算法 / 随机算法 https://en.wikipedia.org/wiki/Fisher–Yates_shuffle ES ...

  8. Regular Expression & rgb2hex

    Regular Expression & rgb2hex regex // 颜色字符串转换 function rgb2hex(sRGB = 'rgb(255, 255, 255)') { co ...

  9. flutter & dart & vs code & bug

    flutter & dart & vs code & bug Waiting for another flutter command to release the startu ...

  10. scroll tabs

    scroll tabs https://github.com/NervJS/taro-ui/blob/dev/src/components/tabs/index.tsx https://github. ...