题目描述

现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位。流水线上有n个位置,从0到n-1依次编号,一开始0号位置空,其它的位置i上有编号为i的盒子。Lostmonkey要按照以下规则重新排列这些盒子。

规则由5个数描述,q,p,m,d,s,s表示空位的最终位置。

首先生成一个序列c,c0=0,ci+1=(ci*q+p) mod m。

接下来从第一个盒子开始依次生成每个盒子的最终位置posi,posi=(ci+d*xi+yi) mod n,xi,yi是为了让第i个盒子不与之前的盒子位置相同的由你设定的非负整数,且posi还不能为s。

如果有多个xi,yi满足要求,你需要选择yi最小的,当yi相同时选择xi最小的。这样你得到了所有盒子的最终位置,现在你每次可以把某个盒子移动到空位上,移动后原盒子所在的位置成为空位。

请问把所有的盒子移动到目的位置所需的最少步数。

题解

这道题有两问,如果解出第一问,第二问就比较简单了,直接统计每组置换的环长就好了。

c[i]+x*d+y这个东西,可以看做先是找到了一个数w,然后一直往后跳d个位置(%n),直到找到第一个空的位置停下,这个东西可以想到用并查集维护。

然后y这个东西我们考虑如何优化枚举过程,如果当前环被填满了,那么就连向下一个点。

细节超级多,到底是%gcd还是%n还是数它在那个环里要想清楚,写错一个地方就凉凉。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 100002
#define int long long
using namespace std;
int ans,fx[N],fy[N],t,n,q,p,s,m,d,c[N],pos[N],id[N];
bool vis[N];
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
inline int findx(int x){return fx[x]=fx[x]==x?x:findx(fx[x]);}
inline int findy(int x){return fy[x]=fy[x]==x?x:findy(fy[x]);}
inline int gcd(int x,int y){return y?gcd(y,x%y):x;}
signed main(){
t=rd();
while(t--){
memset(vis,,sizeof(vis));
memset(id,-,sizeof(id));
n=rd();s=rd();q=rd();p=rd();m=rd();d=rd();
for(int i=;i<n;++i)fx[i]=i;int g=gcd(d,n);
for(int i=;i<n;++i)fy[i]=i;
for(int i=;i<g;++i){
int x=i;
while(id[x]==-)id[x]=i,x=(x+d)%n;
}
fx[s]=(s+d)%n;if(fx[s]==s)fy[id[s]]=(id[s]+)%g;
c[]=;ans=;
for(int i=;i<n;++i)c[i]=(c[i-]*q+p)%m;
for(int i=;i<n;++i){
c[i]%=n;
int y=findy(id[c[i]]);
int x=((y-id[c[i]]+g)%g+c[i]+n)%n;pos[i]=findx(x);
int xp=(pos[i]+d)%n,xx=findx(pos[i]),yy=findx(xp);
if(xx==yy)fy[findy(id[pos[i]])]=findy((id[pos[i]]+)%g);
else fx[xx]=yy;
}
pos[]=s;
for(int i=;i<n;++i)if(i!=pos[i]&&!vis[i]){
int x=i,num=;
while(!vis[x])vis[x]=,num++,x=pos[x];
if(!i)ans+=num-;else ans+=num+;
}
printf("%lld\n",ans);
}
return ;
}

[HNOI2010]物品调度的更多相关文章

  1. 【BZOJ1998】[HNOI2010]物品调度(并查集,模拟)

    [BZOJ1998][HNOI2010]物品调度(并查集,模拟) 题面 BZOJ,为啥这题都是权限题啊? 洛谷 题解 先不管\(0\)位置是个空,把它也看成一个箱子.那么最终的答案显然和置换循环节的个 ...

  2. [HNOI2010] 物品调度 fsk

    标签:链表+数论知识. 题解: 对于这道题,其实就是两个问题的拼凑,我们分开来看. 首先要求xi与yi.这个可以发现,x每增加1,则pos增加d:y每增加1,则pos增加1.然后,我们把x与y分别写在 ...

  3. P3207 [HNOI2010]物品调度

    传送门 完了题目看错了--还以为所有的\(x,y\)都要一样--结果题解都没看懂-- 先考虑如果已经求出了所有的\(pos\)要怎么办,那么我们可以把\(0\)也看做是一个箱子,然后最后每个箱子都在一 ...

  4. [BZOJ1998][Hnoi2010]Fsk物品调度

    [BZOJ1998][Hnoi2010]Fsk物品调度 试题描述 现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位.流水线上有n个位置,从0到n-1依次编号,一开 ...

  5. 【BZOJ 1998】 1998: [Hnoi2010]Fsk物品调度(双向链表+并查集+置换)

    1998: [Hnoi2010]Fsk物品调度 Description 现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位.流水线上有n个位置,从0到n-1依次编号 ...

  6. BZOJ_1998_[Hnoi2010]Fsk物品调度_并查集+置换

    BZOJ_1998_[Hnoi2010]Fsk物品调度_并查集+置换 Description 现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位.流水线上有n个位置 ...

  7. 【BZOJ】1998: [Hnoi2010]Fsk物品调度

    http://www.lydsy.com/JudgeOnline/problem.php?id=1998 题意: 给你6个整数$n,s,q,p,m,d$. 有$n$个位置和$n-1$个盒子,位置编号从 ...

  8. BZOJ 1998: [Hnoi2010]Fsk物品调度 [置换群 并查集]

    传送门 流水线上有n个位置,从0到n-1依次编号,一开始0号位置空,其它的位置i上有编号为i的盒子.Lostmonkey要按照以下规则重新排列这些盒子. 规则由5个数描述,q,p,m,d,s,s表示空 ...

  9. 【BZOJ 1998】[Hnoi2010]Fsk物品调度 置换群+并查集

    置换群的部分水得一比,据说是经典的置换群理论(然而我并不知道这理论是啥).重点就在于怎么求pos!!!容易发现这个东西是这样的:每次寻找pos,先在本环里找,找不到再往下一个环里找,直到找到为止……一 ...

随机推荐

  1. findBugs安装

    点击“Help->InstallNew Software”,如下图所示: 2 接着如下图所示: 3 Name”输入“findBugs”,“Location”输入“http://findbugs. ...

  2. Bootstrap 字体图标(Glyphicons)

    http://www.runoob.com/bootstrap/bootstrap-glyphicons.html 什么是字体图标? 字体图标是在 Web 项目中使用的图标字体.虽然,Glyphico ...

  3. 虚拟机安装CentOS7之后没有ip的问题

    CentOS 7 默认是不启动网卡的(ONBOOT=no),主要是修改一下网上配置,然后重起便可,看这篇博客操作: https://blog.csdn.net/dancheren/article/de ...

  4. C# Note1:深入浅出WPF-MVVM篇

    一.资源说明 (1)配套视频:深入浅出WPF  讲的不错! 待更!

  5. PreparedStatement和Statement

    1 . PreparedStatement 接口继承 Statement , PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2  ...

  6. Python模拟wc命令(软件测试第二次作业)

    Python实现字符,单词,行,代码行,空行及可视化 Gitee项目地址:https://gitee.com/biubiubiuLYQ/word_and_character_statistics 一. ...

  7. DAY07、字符编码和文件操作

    一.字符编码 1.什么是字符编码? 人类能识别的是字符等高级标识符,电脑只能识别0,1组成的标识符,要完成人与机器之间的信息交流,              一定需要一个媒介,进行两种标识符的转化(两 ...

  8. 老男孩python学习自修第十六天【常用模块之sys和os】

    例子: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys. ...

  9. php配置-解决大数据超多字段的POST方式提交无法完全接受的问题

    例如:在盘点表的数据提交中出现了POST大量数据超多字段的将近2000个字段,部分字段没有接受:修改方法为修改php.ini 将max_input_var调大,该值默认为1000 max_input_ ...

  10. How to remove ROM in MAME

    /usr/share/games/mame/roms/ /usr/local/share/games/mame/roms/ sudo rm /usr/local/share/games/mame/ro ...