标签:链表+数论知识。

题解:

  对于这道题,其实就是两个问题的拼凑,我们分开来看。
  首先要求xi与yi。这个可以发现,x每增加1,则pos增加d;y每增加1,则pos增加1。然后,我们把x与y分别写在二维平面上,比如样例:
    x= 0  1
y=0  {0  4}
y=1  {1  5}
y=2  {2  6}
y=3  {3  7}
  发现行数=gcd(n,d),列数=n/gcd(n,d)。
  那么题目要求y尽量小,然后x尽量小。我们先求y,那么初始pos就是ci,把ci放入这张表,寻找最近的可以不重复的行,也就是y。找到之后我们再把ci+y代入,去找在第y行的哪一个数是最近的,这样就能找到x与y了。
  具体的:我们使用rx[i],代表x=i时,右边那个可用的是哪一个,rx_cnt[i]代表距离。同样ry[i],与ry_cnt[i]分别表示y=i的下面的哪一个与距离。每次修改(也就是标记Val已经被使用)仅仅需要对于(Val+d)%n即可,然后rx[Val]=(Val+d)%n,rx_cnt[Val]=1。将Val%=gcd,即可完成对于y的修改。
  修改那么简单,那么查询:类似并查集一样的进行路径压缩,即如果rx[Val]被使用,那么rx[Val]=find(rx[Val]),对应修改rx_cnt[Val]即可,然后返回rx_cnt[Val]为x的值,y同样如此。
  解决了这个问题,下面求解最小步数就很简单了。我们在纸上将i与pos[i]连上一条边,发现会构成很多个环,如果这个环中有0,那么直接把0按照环的反方向依次移动,即可把整个环都归位,如果环中没有0,那么先把0移进去,归位之后再移出来,步数+2即可,这样是最优的方案。证明可以使用置换群什么的。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int MAXN=;
bool vis[MAXN];
int T,n,s,q,p,m,d,ans;
int c[MAXN],pos[MAXN],cnt[MAXN],rx[MAXN],ry[MAXN],rx_cnt[MAXN],ry_cnt[MAXN];
inline int gi(){int res; scanf("%d",&res); return res;}
int gcd(int A,int B)
{
if(A%B==)return B;
return gcd(B,A%B);
}
void insert(int x)
{
int tmp;
if((tmp=x+d)>=n)tmp-=n;
rx[x]=tmp;
rx_cnt[x]=;
x%=m;
if(--cnt[x])return;
if((tmp=x+)>=m)tmp-=m;
ry[x]=tmp;
ry_cnt[x]=;
}
int query(int *r,int *r_cnt,int x)
{
if(r[x]==x)return ;
r_cnt[x]=r_cnt[x] + query(r,r_cnt,r[x]);
r[x]=r[r[x]];
return r_cnt[x];
}
int main()
{
T=gi();
while(T--)
{
scanf("%d%d%d%d%d%d",&n,&s,&q,&p,&m,&d); pos[]=s;
for(int i=;i<n;i++) c[i]=((LL)c[i-]*q+p)%m;
d%=n;//insert()中没有使用取模,而是使用减法代替,所以这里先模一下。
m=gcd(n,d);
for(int i=;i<m;i++)
{
cnt[i]=n/m;
ry[i]=i;
ry_cnt[i]=;
}
for(int i=;i<n;i++) rx[i]=i,rx_cnt[i]=;
insert(pos[]);
for(int i=;i<n;i++)
{
int y=query(ry,ry_cnt,c[i]%m);
int x=query(rx,rx_cnt,(c[i]+y)%n);
pos[i]=((LL)d*x+y+c[i])%n;
insert(pos[i]);
}
ans=; memset(vis,,sizeof vis);
for(int i=;i<n;i++)
if(!vis[i])
{
int now=i,Start=i,flag=,cnt=;
do
{
vis[now]=; cnt++;
if(now==)flag=;
now=pos[now];
}while(now!=Start);
if(cnt>)
{
ans+=cnt-;
if(!flag)ans+=;
}
}
printf("%d\n",ans);
}
return ;
}

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

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

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

  2. [HNOI2010]物品调度

    题目描述 现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位.流水线上有n个位置,从0到n-1依次编号,一开始0号位置空,其它的位置i上有编号为i的盒子.Lostm ...

  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. port_443

    GRC | Port Authority, for Internet Port 443 https://www.grc.com/port_443.htm

  2. Chef vs Puppet vs Ansible vs Saltstack: Which Works Best For You?

    Ansible vs SaltStack 谁才是自动化运维好帮手? - CSDN博客 https://blog.csdn.net/a105421548/article/details/53558598 ...

  3. Splits a tensor into sub tensors

    https://www.tensorflow.org/api_docs/python/tf/split # 'value' is a tensor with shape [5, 30] # Split ...

  4. 阿里妈妈-RAP项目的实践(3)

    接下来,我们就把我们的代码运用到项目中,因为我们前台是有jquery,后台管理系统是用angularjs mock在这两种的调用方式不一样,所以我就用nginx的proxy_pass 来代理 我在项目 ...

  5. 录音-树莓派USB摄像头话筒

    实测可用: sudo arecord --duration=10 --device=plughw:1,0 --format=cd aaa.wav sudo arecord --duration=10 ...

  6. The PageFactory

    The PageFactory 原文地址:https://github.com/SeleniumHQ/selenium/wiki/PageFactory In order to support the ...

  7. 自定义fragmentlayout

    一.抽取视图文件,实例化需要在xml文件中 先上效果图: 1.  编写 xml布局文件 <?xml version="1.0" encoding="utf-8&qu ...

  8. MySQL学习笔记(六)—— MySQL自连接

    有的时候我们需要对同一表中的数据进行多次检索,这个时候我们可以使用之前学习过的子查询,先查询出需要的数据,再进行一次检索. 例如:一张products表,有产品id,供应商id(vend_id),产品 ...

  9. 10个常见的 Android 新手误区

    在过去十年的移动开发平台中,作为资深的移动开发人员,我们认为Android平台是一个新手最广为人知的平台.它不仅是一个廉价的工具,而且有着良好的开发社区,以及从所周知的编程语言(Java),使得开发A ...

  10. Java 高阶 —— 相等性比较

    1. 包装类 所有的相同类型的包装类对象之间的值的比较,全部使用 equals 方法: 对于 Integer a = ?,在 -128 到 127 范围内的赋值,Integer 对象是在 Intege ...