题目描述

由于众所周知的原因,冈部一直欠真由理一串香蕉。
为了封上真由理的嘴,冈部承诺只要真由理回答出这个问题,就给她买一车的香蕉:
一开始有$n$个人围成一个圈,从$1$开始顺时针报数,报出$m$的人被机关处决。然后下一个人再从$1$开始报数,直到只剩下一个人。
红莉栖:“这不就是约瑟夫问题吗...”
伦太郎:“助手你给我闭嘴!”
真由理虽然已经晕头转向了,但听到有一车的香蕉,两眼便放出了光芒。
“那个呢,真由氏很想要一车子的香蕉呢。如果可以帮帮我的话,我可以把一些香蕉分给你哟,诶嘿嘿。拜托你啦。”


输入格式

第一行一个整数$T$,表示数据组数。
接下来$T$行,每行两个整数$n,m$。


输出格式

对于每组数据,输出一行一个整数,表示幸存者的编号。


样例

样例输入:

5
4 6
2 8
2 9
8 8
7 9

样例输出:

3
1
2
4
7


数据范围与提示

对于$100\%$的数据,$1\leqslant T\leqslant 20,1\leqslant n\leqslant 10^9,1\leqslant m\leqslant 10^5$。


题解

经典的约瑟夫问题,其式子就是$f_i=(f_{i-1}+m)\mod i$,但是只有$20$分很恐怖,于是我们考虑优化。

发现虽然每一步都在加$m$但是$mod$的次数还是很少的,实际上只有$\log$次,那么我们可以直接计算得到下一次$mod$的位置,然后直接跳过去。

时间复杂度:$\Theta(T\times m\log n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long ans;
int main()
{
int T;scanf("%d",&T);
while(T--)
{
ans=0;
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++)
{
long long k=min((i-ans)/m-1,n-i-1);
if(k>0&&k<n){ans+=k*m;i+=k;}
ans=(ans+m)%i;
}
printf("%lld\n",ans+1);
}
return 0;
}

rp++

[CSP-S模拟测试]:嘟嘟噜(约瑟夫问题)的更多相关文章

  1. csps-s模拟测试60嘟嘟噜,天才绅士少女助手克里斯蒂娜,凤凰院凶真题解

    题面:https://www.cnblogs.com/Juve/articles/11625190.html 嘟嘟噜: 约瑟夫问题 第一种递归的容易re,但复杂度较有保证 第二种适用与n大于m的情况 ...

  2. csp-s模拟测试60

    csp-s模拟测试60       2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴 ...

  3. [考试反思]1005csp-s模拟测试60:招魂

    最近总是好一场烂一场的.没有连续两场排名波动小于20的... 没人管.反正大脸一点脸没有就又AK了. 但是T3爆零这种事情吧... 爆搜不是很难打,但是想优化想了半天剩的时间不够结果赶忙打出来了,然后 ...

  4. [CSP-S模拟测试60]题解

    回去要补一下命运石之门了…… A.嘟嘟噜 给定报数次数的约瑟夫,递推式为$ans=(ans+m)\% i$. 考虑优化,中间很多次$+m$后是不用取模的,这种情况就可以把加法变乘法了.问题在于如何找到 ...

  5. 0823NOIP模拟测试赛后总结

    考了两场感觉虚了... NOIP模拟测试30 分着考的. 就只有T2的美妙的暴力拿分了,60分rank10,挂了. T1是一道sb题,爆零了十分遗憾. 许多人都掉进了输出格式的坑里,C没大写.少个空格 ...

  6. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  7. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  8. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  9. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

随机推荐

  1. axios 获取不到数据错误

    1.问题: 打算学习下vue,但是vue-resource作者已经不更新了,并且大家都建议用axios来进行前后端交互,所以就从学习axios开始. 但是在使用 axios 的过程中,自己写的接口竟然 ...

  2. 毒瘤阅读题 LightOJ - 1220

    Mysterious Bacteria LightOJ - 1220 https://vjudge.net/problem/LightOJ-1220 "Each case starts wi ...

  3. 003/node.js--代理服务(解决跨域问题)

    业务描述: 1.web前端发送http请求 2.web后端为https协议 如何保证web前端发送http请求到web后端(跨域问题:域名不一致即跨域), 因此用node.js写了个代理服务,转发前端 ...

  4. webpack前端模块打包器

    webpack前端模块打包器 学习网址: https://doc.webpack-china.org/concepts/ http://www.runoob.com/w3cnote/webpack-t ...

  5. Http中Content-Type的取值讲解

    一.Content-Type的取值 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息(MediaType,即是Internet Media Type,互联网媒体类型: ...

  6. SpringMvc+Mybatis开发需要的jar包

    SpringMvc+Mybatis开发需要的jar包

  7. Java-集合第三篇List集合

    1.List集合 有序可重复集合,集合中的每个元素都有其对应的顺序索引. 2.List相对于Collection额外提供的方法: 1>void add(int index,Object elem ...

  8. Java判断一个日期是否在下周日期区间

    Java实现判断一个日期是否在下周日期区间的方法 /** * 判断输入的日期是否在下周区间 * @return * @author nemowang */ public static boolean ...

  9. python random模块导入及用法

    random是程序随机数,很多地方用到,验证码,图片上传的图片名称等,下面说说python random模块导入及用法 1,模块导入 import random 2,random用法 random.r ...

  10. HCL AppScan Standard 9.0.3.13

    https://pan.baidu.com/s/1mh97vyJdWy1CmF589jZJhQ 网盘密码: q31g / 压缩密码:shungg.cn http://www.shungg.cn/pos ...