BZOJ3434 WC2014时空穿梭(莫比乌斯反演)
考虑枚举相邻点距离差的比例。显然应使比例值gcd为1以保证不重复统计。确定比例之后,各维坐标的方案数就可以分开考虑。设比例之和为k,则若坐标上限为m,该维坐标取值方案数即为Σm-ki (i=1~⌊m/k⌋),也即⌊m/k⌋·m-k·(⌊m/k⌋+1)·⌊m/k⌋/2,设其为f(m,k)。总方案数即将各维方案数相乘,设为F(k)。
于是得到答案即为ΣkΣa1Σa2……Σac-2 [gcd(a1,a2,……,ac-2,k)=1]·F(k)。套路一波,得到Σk F(k)·(Σd μ(d)·g(k/d)) (d|k),其中g(n)为将n划成c-1份的方案数,也即C(n-1,c-2)。对每个询问暴力一遍,复杂度即为O(Tnm)。注意这里的组合数只能递推,因为值域比模数还大。
卡卡常就过了毕竟正解的复杂度也优不到哪里去。
考虑优化。容易想到整除分块。固定⌊m/k⌋后,要求和的部分是一个关于k的n次多项式。分治NTT暴力求出多项式系数对各项求个前缀和即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
#define P 10007
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int T,n,c,a[],b[],mobius[N],prime[N],g[][N],f[][][N],p[],C[N][],fac[N],inv[N],cnt;
bool flag[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj3434.in","r",stdin);
freopen("bzoj3434.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
mobius[]=;
for (int i=;i<=N-;i++)
{
if (!flag[i]) prime[++cnt]=i,mobius[i]=-;
for (int j=;j<=cnt&&prime[j]*i<=N-;j++)
{
flag[prime[j]*i]=;
if (i%prime[j]==) break;
mobius[prime[j]*i]=-mobius[i];
}
}
C[][]=;
for (int i=;i<=N-;i++)
for (int j=;j<=min(,i);j++)
C[i][j]=(C[i-][j-]+C[i-][j])%P;
for (int c=;c<=;c++)
for (int i=;i<=N-;i++)
if (mobius[i])
for (int j=i;j<=N-;j+=i)
g[c][j]=(g[c][j]+mobius[i]*(c->j/i-?:C[j/i-][c-])+P)%P;
int s=;
for (int c=;c<=;c++)
for (int i=;i<=N-;i++)
{
int s=;
for (int k=;k<=;k++)
{
f[k][c][i]=(f[k][c][i-]+g[c][i]*s)%P;
s=s*i%P;
}
}
T=read();
while (T--)
{
n=read(),c=read();int m=N,ans=;
for (int i=;i<=n;i++) m=min(m,a[i]=read());
for (int i=;i<=m;i++)
{
int t=m;p[]=;for (int j=;j<=n;j++) t=min(t,a[j]/(b[j]=a[j]/i)),p[j]=;
for (int j=;j<=n;j++)
{
for (int k=j;k>=;k--)
p[k]=(1ll*p[k]*b[j]*a[j]-1ll*p[k-]*(b[j]+)*b[j]/)%P;
p[]=1ll*p[]*b[j]*a[j]%P;
}
for (int j=;j<=n;j++)
ans=(ans+p[j]*(f[j][c][t]-f[j][c][i-])%P+P)%P;
i=t;
}
cout<<ans<<endl;
}
return ;
}
BZOJ3434 WC2014时空穿梭(莫比乌斯反演)的更多相关文章
- 【BZOJ3434】[Wc2014]时空穿梭 莫比乌斯反演
[BZOJ3434][Wc2014]时空穿梭 Description Input 第一行包含一个正整数T,表示有T组数据求解每组数据包含两行,第一行包含两个正整数N,C(c>=2),分别表示空间 ...
- BZOJ 3434 [WC2014]时空穿梭 (莫比乌斯反演)
题面:BZOJ传送门 洛谷传送门 好难啊..反演的终极题目 首先,本题的突破口在于直线的性质.不论是几维的空间,两点一定能确定一条直线 选取两个点作为最左下和最右上的点! 假设现在是二维空间,选取了$ ...
- [WC2014]时空穿梭(莫比乌斯反演)
https://www.cnblogs.com/CQzhangyu/p/7891363.html 不难推到$\sum\limits_{D=1}^{m_1}\sum\limits_{d|D}C_{d-1 ...
- UOJ#54 BZOJ3434 [WC2014]时空穿梭
题目描述 小 X 驾驶着他的飞船准备穿梭过一个 \(n\) 维空间,这个空间里每个点的坐标可以用 \(n\) 个实数表示,即 \((x_1,x_2,\dots,x_n)\). 为了穿过这个空间,小 X ...
- BZOJ3434 [Wc2014]时空穿梭
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- UOJ 54 【WC2014】时空穿梭——莫比乌斯反演
题目:http://uoj.ac/problem/54 想写20分. Subtask 2 就是枚举4个维度的值的比例,可算对于一个比例有多少个值可以选,然后就是组合数.结果好像不对. 因为模数太小,组 ...
- [WC2014]时空穿梭
这才叫莫比乌斯反演题. 一.题目 点此看题 二.解法 也没有什么好的思路,我们不妨把暴力柿子写出来,我们想枚举直线,但是这道题不能枚举直线的斜率,所以就要用整数来表示直线,我们不妨枚举出发点和终止点的 ...
- 【BZOJ】3434: [Wc2014]时空穿梭
http://www.lydsy.com/JudgeOnline/problem.php?id=3434 题意:n维坐标中要找c个点使得c个点在一条线上且每一维的坐标单调递增且不能超过每一维限定的值m ...
- 莫比乌斯反演题表II
bzoj3994:[SDOI2015]约数个数和 **很好推+有个小结论bzoj3309:DZY Loves Math ***很好推+线筛某函数/卡常bzoj4816:[Sdoi2017]数字表格 * ...
随机推荐
- C++之静态的变量和静态函数
到目前为止,我们设计的类中所有的成员变量和成员函数都是属于对象的,如我们在前面定义的book类,利用book类声明两个对象Alice和Harry,这两个对象均拥有各自的price和title成员变量, ...
- C++ 怎么让静态变量只初始化一次
童鞋们在学习C++的时候,往往只是按照书本上的原文去强行记忆各种特性,比方说,静态变量只初始化一次.你心中一定在默念:一定要记住,static只会初始化一次云云,希望自己能够记住.告诉你,你为什么总是 ...
- SqlServer执行大的数据库脚本出错解决方法
如果执行线上项目拷下来sqlserver的.sql的数据库脚本文件,如果文件较大时,那么就会报错内存不足之类的. 这时可以在命令提示符使用命令来执行脚本文件.切记,执行前先改一下数据库存放位置! 命令 ...
- 网络对抗技术 2017-2018-2 20152515 Exp6 信息搜集与漏洞扫描
1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法.包括: (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的 ...
- 20155320《网络对抗》Exp4 恶意代码分析
20155320<网络对抗>Exp4 恶意代码分析 [系统运行监控] 使用schtasks指令监控系统运行 首先在C盘目录下建立一个netstatlog.bat文件(由于是系统盘,所以从别 ...
- 【WPF】给TextBox添上Label
原文:[WPF]给TextBox添上Label 引言 在客户端开发中,要说出现频率大的控件,必定有TextBox的身影.然而在TextBox的旁边通常得有个基友Label,形影不离.为此,我们 ...
- MySQL优化:explain using temporary
什么时候会使用临时表:group/order没设计好的时候 1.order没用索引 2.order用了索引, 但不是和where相同的索引 3.order用了两个索引, 但不是联合索引 4.order ...
- CF708D Incorrect Flow
CF708D Incorrect Flow 有源汇上下界最小费用可行流.(= =) 对每条给定的边连边: 首先\(f_i\)是给定的,所以要有一条这个边而且要流满,先\(a_i-b_i\)连一条上下界 ...
- JS关闭窗口而不提示
使用js关闭窗口而不提示代码: window.opener = null; window.open( '', '_self' ); window.close();
- effective c++ 笔记 (9-12)
//---------------------------15/03/29---------------------------- //#9 绝不在构造和析构过程中调头virtual函数 { / ...