Made by 退役的OIer

第一次写博客,写得不好 or 不清楚的可以 在下方留言,我会尽量改进的!


好啦~~~回到正题,题面见传送门

【问题描述】

  采药人最近在认真切题,但回旋的转盘时常在眼前浮现,旧日的美好时光总把他带回那个无忧无虑的押忍战斗应援团的时代。于是他在切题的时候也按照这样的规则以怀念旧时光。
  规则是这样的:采药人手头有 n 道题,他会将其按 1 到 n 的顺序绕成一个环,他会从 1开始按照 1 到 n 顺序每隔 p 道没写过的写一题,直到这些题都写完了。他想知道这些题中第 k 个被他切掉的题是第几题?
  如有 7 道题,采药人每隔 3 道写一题。那么他写题的顺序是 3 6 2 7 5 1 4。

【输入格式】

第一行,一个整数 t,表示数据组数
接下来 t 行,每行三个正整数 n,p,k,意义如题目所述

【输出格式】

t 行,每行一个整数,表示答案

【输入输出样例】

rule.in
1
7 3 7
rule.out
4

【数据规模】

对于 20%,k<=n<=1000,p<=100
对于 40%,k<=n<=10000,p<=1000
对于另外 20%,k<=n<=1000000000,p<=2
对于 100%,t<=10,k<=n<=10^14,p<=10000

solution:

  首先我们可以看出这就是Joseph问题(如果不会请移步至Joseph问题

最最基础的算法就是模拟啦~~~

数p道题就切掉当前这个,重复k次,我们当然可以使用循环链表模拟这个过程(很形象的)

部分代码如下:

void pre()
{
FOR(i,,n)
{
l[i]=(i==)?n:i-;
r[i]=(i==n)?:i+;
}
return;
}
void del(int x)//在链表中删除x(即把x两边的连起来)
{
r[l[x]]=r[x];
l[r[x]]=l[x];
return;
}
//在main中
int pos=n;
while(k-->)
{
FOR(i,,p) pos=r[pos];
del(pos);
}
printf("%d",pos);

哈哈,是不是很简单?

然而,仔细一想,整个算法时间复杂度为O(pk)

emmm....显然炸得裂开

我们急需寻找一个更为高效的算法

递推!

我们发现,一个队列进行一次切题操作后,长度会减小1,而队列开头到切掉的题的下一个

即可以从此处重新编号1~(n-1),相当于对当前队列编号整体减p

(自己推一推,模拟  切 一 道 题  的过程)

假设f[i][j]为队列长度为 i 时 , 切掉的第 j 道题的编号

则有以下递推式:

初态即

又可以发现,f数组没有必要,只用一个变量pos即可

那么代码就出来了:

//在main中
int pos=(p-)%(n-k+)+;
FOR(i,n-k+,n)
{
pos=(pos+p-)%i+;
}
printf("%d",pos);

分析一波发现,算法时间复杂度降到了O(k)

wow~~~优(yiu)秀(xiu)

欣喜地看看数据范围, ?@#(*%&@#!

k<=n<=10^14

这说明我们需要更~~~~~~~~高效的算法!

???(仔细想想怎么优化,想完再往下看)




就一个小优化即可:乘法加速

用乘法加速加法运算(是不是很简单)

(不对呀,这里有取模,怎么加速???)

很容易发现,取模并不是每次都有改变,就是说取模把加法分成了若干小段,每个小段中pos是连加的

每次 i 增加 1 时, pos 增加 p(是不是很像追及问题?)

那么每段中, i 就会增加 tmp, 其中

这样就很好办了~~~

再就不多说了,见完整代码

#include<cstdio>
#define ll long long
#define rll register ll
ll n,p,k,len,pos;
int T;
int main()
{
scanf("%d",&T);
while(T-->)
{
scanf("%lld%lld%lld",&n,&p,&k);
if(p==) printf("%lld\n",k);//注意特判p==1的时候
else
{
len=n-k+;pos=(p-)%len+;
for(rll tmp();len+tmp<=n;tmp=(len-pos)/(p-)+)
pos=(pos+tmp*p-)%(len+=tmp)+;
printf("%lld\n",(pos+(n-len)*p-)%n+);
}
}
return ;
}

是不是很简单?

复杂度也很简单,O(T * F(k) )(其中F(k)为关于k的函数,值很小,可近似为log(k))

愉快地  切 一 道 题  啦~~~


最后,

感谢   P.Y.Y  提供的官方题解平台~~~

感谢各位   巨佬&&神犇   的支持与鼓励~~~

可别忘了指正,转发与推荐哟~

(链接:https://www.cnblogs.com/HSY-2019/p/12367741.html)

【题解】 2月19日 厦门双十中学NOIP2014模拟D2 T1 采药人的切题规则的更多相关文章

  1. 【题解】 2月19日 厦门双十中学NOIP2014模拟D2 T2 采药人接水果

    [问题描述] 采药人虽然 AFO(SU),但他在闲暇的时候还是可以玩一玩接水果(cat)的.但他渐渐发现 cat 好像有点太弱智.于是他不想浪费他的智商,于是决定写一个程序帮他玩. cat 是这样玩的 ...

  2. 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T4 过路费

    [Usaco 2009 Gold]JZOJ2020年9月19日提高B组T4 过路费 题目 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之 ...

  3. 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T3 头晕的奶牛

    [Usaco 2009 Gold]JZOJ2020年9月19日提高B组T3 头晕的奶牛 题目 Description 奶牛们发现,在农场里面赛跑是很有趣的一件事.可是她们一旦在农场里面不断地转圈,就会 ...

  4. 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题

    [Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...

  5. 【Usaco 2009 Silver】JZOJ2020年9月19日提高B组T1 音乐节拍

    [Usaco 2009 Silver]JZOJ2020年9月19日提高B组T1 音乐节拍 题目 Description FJ准备教他的奶牛弹奏一首歌曲,歌曲由N(1<=N<=50,000) ...

  6. Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档

    array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片 ...

  7. 2016年12月19日 星期一 --出埃及记 Exodus 21:14

    2016年12月19日 星期一 --出埃及记 Exodus 21:14 But if a man schemes and kills another man deliberately, take hi ...

  8. 2016年11月19日 星期六 --出埃及记 Exodus 20:10

    2016年11月19日 星期六 --出埃及记 Exodus 20:10 but the seventh day is a Sabbath to the LORD your God. On it you ...

  9. 2016年10月19日 星期三 --出埃及记 Exodus 19:3

    2016年10月19日 星期三 --出埃及记 Exodus 19:3 Then Moses went up to God, and the LORD called to him from the mo ...

随机推荐

  1. typescript 为什么使用 let呢

    为什么是使用let呢 因为已经厌烦了 int var 呵呵

  2. LOJ6053 简单的函数

    题目传送门 分析: 对于这道题来说,当\(x\)为质数时: \(~~~~f(x)=x-1+2[x=2]\) 因为除2以外的质数都是奇数,它们与1异或就是减一,然后2就是加一 然后我们先来康康怎么快速求 ...

  3. 对于Python中的字节串bytes和字符串以及转义字符的新的认识

    事情的起因是之前同学叫我帮他用Python修改一个压缩包的二进制内容用来做fuzz,根据他的要求,把压缩包test.rar以十六进制的方式打开,每次修改其中一个十六进制字符串并保存为一个新的rar用来 ...

  4. docker-Gitlab、GitLab Runner安装

    以下操作均在CentOs下操作 1.Gitlab install ① 启动gitlab docker run --detach \ --hostname 115.30.149.35 \ --publi ...

  5. Web自动化测试项目搭建目录

    Web自动化测试项目搭建(一) 需求与设计 Web自动化测试项目(二)BasePage实现 Web自动化测试项目(三)用例的组织与运行 Web自动化测试项目(四)测试报告 Web自动化测试项目(五)测 ...

  6. tomcat+jenkins搭建持续化集成环境

    一.下载安装Tomcat 1.进入官网http://tomcat.apache.org/ 2.解压缩文件到指定目录 3.设置环境变量 a.新建CATALINA_HOME b.在path中设置 %CAT ...

  7. Java之路——初识Eclipse

    零.大纲 一.前言 二.获取Eclipse 三.运行Eclipse 四.创建及运行第一个Java Project 五.界面介绍 六.如何调试 七.获取插件 八.Eclipse 快捷键 九.总结 一.前 ...

  8. vue中导入bootstrap.css

    1.利用cnpm下载然后导入,用npm也是一样的: cnmp install bootstrap -S 在main.js文件下导入: import "bootstrap/dist/css/b ...

  9. 《快乐编程大本营》java语言训练班 1课:第一个java程序:你好,范冰冰;

    1Java介绍 2安装java环境JDK 3安装web环境tomcat 4安装开发工具Idea2017 5编写第一个程序 ‘你好,范冰冰!’ 地址: http://code6g.com 1.Java介 ...

  10. 聊聊“装箱”在CLR内部的实现

    原文连接:https://mattwarren.org/2017/08/02/A-look-at-the-internals-of-boxing-in-the-CLR/ 作者 Matt Warren. ...