UOJ 54 【WC2014】时空穿梭——莫比乌斯反演
想写20分。 Subtask 2 就是枚举4个维度的值的比例,可算对于一个比例有多少个值可以选,然后就是组合数。结果好像不对。
因为模数太小,组合数不能用阶乘的那个公式。不过 c*m 递推即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int mod=;
int Mn(int a,int b){return a<b?a:b;}
int Mx(int a,int b){return a>b?a:b;}
void upd(int &x){x>=mod?x-=mod:;}
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=ret*x%mod;x=x*x%mod;k>>=;}return ret;}
int gcd(int a,int b){return b?gcd(b,a%b):a;} const int N=,M=1e5+,Q=;
int T,n[Q],k[Q],m[Q][N],c[M][];
void init_c(int n,int m)
{
for(int i=;i<=n;i++)c[i][]=;
for(int i=;i<=n;i++)
for(int j=,k=Mn(i,m);j<=k;j++)
c[i][j]=c[i-][j]+c[i-][j-],upd(c[i][j]);
}
void solve1()
{
init_c(,);
for(int t=;t<=T;t++) printf("%d\n",c[m[t][]][k[t]]);
}
int cs[],ans;
void dfs(int cr,int bh)
{
if(cr>n[bh])
{
int mn=;
for(int i=;i<=n[bh];i++)
mn=Mn(mn,m[bh][i]/cs[i]);
ans+=c[mn][n[bh]];upd(ans); return;
}
for(int i=,lm=m[bh][cr];i<=lm;i++)
{
bool flag=;
for(int j=;j<cr;j++)
if(gcd(cs[j],i)>){flag=;break;}
if(flag)cs[cr]=i,dfs(cr+,bh);
}
}
void solve3()
{
init_c(,);
for(int t=;t<=T;t++)
{
ans=;dfs(,t);printf("%d\n",ans);
}
}
int main()
{
T=rdn();bool fg1=,fg3=;
for(int t=;t<=T;t++)
{
n[t]=rdn();k[t]=rdn();
fg1|=(n[t]!=);
for(int i=;i<=n[t];i++)m[t][i]=rdn(),fg3|=(m[t][i]>);
}
if(!fg1){solve1();return ;}
if(!fg3){solve3();return ;}
return ;
}
正解是在枚举一组答案里的距离最远的两个点。可选的位置就是每一维的差值 xi 的 gcd +1 ,方案就是 \( C_{gcd-1}^{c-2} * \prod_{i=1}^{n}(m_{i}-x_{i}) \) ;然后反演一番之类的。
https://www.cnblogs.com/Zinn/p/10272661.html
当出现 \( \prod(m_{i}\left\lfloor\frac{m_{i}}{D}\right\rfloor - D\frac{(1+\left\lfloor\frac{m_{i}}{D}\right\rfloor)\left\lfloor\frac{m_{i}}{D}\right\rfloor}{2} \) 的时候,因为除了 D 以外的部分可以分块,所以把它看成关于 D 的多项式的想法很好。
虽然模数是 10007 ,两个乘起来也不会爆 int ,但 m[ i ] 很大,所以还是得到处写 (ll) 。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,C=,M=1e5+,mod=;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
void upd(int &x){x>=mod?x-=mod:;x<?x+=mod:;}
int pw(int x,int k){int ret=;while(k){if(k&)ret=ret*x%mod;x=x*x%mod;k>>=;}return ret;} int T,c[M][C],u[M],f[N][C][M],pri[M],cnt;bool vis[M];
void init()
{
int n=,nc=,m=1e5;
u[]=;
for(int i=;i<=m;i++)
{
if(!vis[i])pri[++cnt]=i,u[i]=-;
for(int j=,d;j<=cnt&&(d=i*pri[j])<=m;j++)
{
vis[d]=;if(i%pri[j])u[d]=-u[i];else {u[d]=;break;}
}
}
for(int i=;i<m;i++)c[i][]=;
for(int k=nc-,i=;i<k;i++)
for(int j=;j<=i;j++)c[i][j]=c[i-][j]+c[i-][j-],upd(c[i][j]);
for(int k=nc-,i=k;i<m;i++)
for(int j=;j<=k;j++)c[i][j]=c[i-][j]+c[i-][j-],upd(c[i][j]);
for(int tc=;tc<=nc;tc++)
{
for(int i=;i<=m;i++)
for(int j=i,k=;j<=m;j+=i,k++)
f[][tc][j]+=c[i-][tc-]*u[k],upd(f[][tc][j]);
for(int j=;j<=m;j++)
for(int i=;i<=n;i++)f[i][tc][j]=f[i-][tc][j]*j%mod;
}
for(int i=;i<=n;i++)
for(int tc=;tc<=nc;tc++)
for(int j=;j<=m;j++)f[i][tc][j]+=f[i][tc][j-],upd(f[i][tc][j]);
}
int n,tc,a[N],m[N],tm[N];
void cz(int bh)
{
memset(a,,sizeof a);a[]=;
for(int i=;i<=n;i++)
{
int x=((ll)tm[i]*(tm[i]+)>>)%mod, y=(ll)tm[i]*m[i]%mod;//(ll)!!!
x=-x; upd(x);//
for(int j=n;j;j--)//--!!!
a[j]=((ll)a[j-]*x+(ll)a[j]*y)%mod;
a[]=a[]*y%mod;
}
}
int cal()
{
int ret=;
int lm=m[];for(int i=;i<=n;i++)lm=Mn(lm,m[i]);
for(int i=,nt;i<=lm;i=nt+)
{
nt=lm;for(int j=;j<=n;j++)tm[j]=m[j]/i,nt=Mn(nt,m[j]/tm[j]);
cz(i);
for(int j=;j<=n;j++)ret=(ret+a[j]*(f[j][tc][nt]-f[j][tc][i-]))%mod,upd(ret);
}
return ret;
}
int main()
{
init();T=rdn();
while(T--)
{
n=rdn();tc=rdn();for(int i=;i<=n;i++)m[i]=rdn();
if(tc==)
{
int ret=;for(int i=;i<=n;i++)ret=ret*m[i]%mod;printf("%d\n",ret);
}
else printf("%d\n",cal());
}
return ;
}
UOJ 54 【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/ ...
 - [WC2014]时空穿梭
		
这才叫莫比乌斯反演题. 一.题目 点此看题 二.解法 也没有什么好的思路,我们不妨把暴力柿子写出来,我们想枚举直线,但是这道题不能枚举直线的斜率,所以就要用整数来表示直线,我们不妨枚举出发点和终止点的 ...
 - BZOJ3434 WC2014时空穿梭(莫比乌斯反演)
		
考虑枚举相邻点距离差的比例.显然应使比例值gcd为1以保证不重复统计.确定比例之后,各维坐标的方案数就可以分开考虑.设比例之和为k,则若坐标上限为m,该维坐标取值方案数即为Σm-ki (i=1~⌊m/ ...
 - 【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]数字表格 * ...
 
随机推荐
- 辅助模块应用(auxiliary/scanner/portscan/tcp)
			
实验步骤 创建msf所需的数据库 之前我们开启msf时下面总会出现一个红色的小减号,原来是因为没有和数据库键连接,于是首先我们要手动建立一个数据库... 使用命令来实现: service postgr ...
 - 2017-2018-1 信息安全技术 实验二 20155201——Windows口令破解
			
2017-2018-1 信息安全技术 实验二 20155201--Windows口令破解 一.实验原理 口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理员的了解 ...
 - 【bzoj5170】Fable(树状数组)
			
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5170 我们会发现,经过一轮冒泡后,若a[i]的前面有比它大的数,就一定会有一个被丢到后 ...
 - Vue.js 2.x中事件总线(EvevntBus)及element-ui中全屏loading的使用
			
事件总线(Event Bus)可以在vue项目的index.js文件中创建,也可以在一个独立的.vue文件中创建.使用时,在各个子组件中引入该组件即可. 项目中的全屏loading较多时,可以在根组件 ...
 - BZOJ 2226 【SPOJ 5971】 LCMSum
			
题目链接:LCMSum 这个题显然就是要我们推式子了……那么就来推一波: \begin{aligned}&\sum_{i=1}^n lcm(i,n) \\=&\sum_{i=1}^n\ ...
 - 100W数据,测试复合索引
			
复合索引不是那么容易被catch到的. 两个查询条件都是等于的时候,才会被catch到. mysql> select count(*) from tf_user_index where sex ...
 - Redis并发竞争
			
Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘.由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对Redi ...
 - JavaScript Number() Vs new Number()
			
最近在优化一个页面时候.IDEA 提示我错误的使用了包装类.当时感觉很诧异. 随后.我上Stack Overflow上面查了一下,终于发现了问题所在. new Number('123') 与 Numb ...
 - 【Python】解决测试依赖之 Mock模块的基本使用
			
什么是mock? Mock,顾名思义,模拟,在我们日常生活中或者影视作品中见得最多的可能就是预备飞行员的模拟训练,印象比较深的是电影<萨利机长>中的模拟器,经过几千次模拟,人们得出机长萨利 ...
 - [sql]SET NOCOUNT ON 的作用
			
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息. 说明: 场景1:(不使用SET NOCOUNT) 场景2:(使用SET NOCOUNT ON ) 场景3:(使用SET N ...