题目描述

由于众所周知的原因,冈部一直欠真由理一串香蕉。
为了封上真由理的嘴,冈部承诺只要真由理回答出这个问题,就给她买一车的香蕉:
一开始有$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++

最新文章

  1. Android Socket连接PC出错问题及解决
  2. DI中Transient Scoped Singleton Instance的区别
  3. mysql二进制文件操作语法(mysql binary log operate statements)
  4. 自动化运维:flask-bootstrap + highstock整合
  5. 如何判断retina,如何判断设备的比例
  6. Codeforces Round #281 (Div. 2) D. Vasya and Chess 水
  7. Mysql启停以及恢复备份恢复数据库
  8. Codeforces Round #333 DIV2
  9. libz.so库分析
  10. NSURLSessionDownloadTask 断点下载
  11. 【实习记】2014-08-18使用curl排错http头的content-length
  12. java中的继承要点
  13. Spring4.0学习笔记(12) —— JDBCTemplate 操作数据库
  14. 简易实现 TextView单行文本水平触摸滑动效果
  15. fputcsv 和 fgetcsv
  16. P2P中的NAT穿越方案简介
  17. SQL Server Backup &amp; Restore
  18. java复习笔记
  19. 带你深入理解STL之Vector容器
  20. video.js 一个页面同时播放多个视频

热门文章

  1. hive重要命令
  2. Java 位运算符和移位运算符
  3. oracle--批量删除部分表,将某一列拼接成字符串
  4. [Git] 006 在本地新建一个仓库
  5. MySQL-第十四篇事务管理
  6. Maven将jar包放入本地库
  7. CentOS7 设置电源选项,待机、睡眠、挂起
  8. 了解Greenplum(1)
  9. javaweb各种框架组合案例(九):springboot+tk.mybatis+通用service
  10. python pip安装模块报错 &quot;Can&#39;t connect to HTTPS URL because the SSL module is not available.&quot;