博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
noip2013 转圈游戏
阅读量:6004 次
发布时间:2019-06-20

本文共 1081 字,大约阅读时间需要 3 分钟。

传送门:

题目描述

n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏。按照顺时针方向给 n 个位置编号,从0 到 n-1。最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类推。游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,……,依此类推,第n − m号位置上的小伙伴走到第 0 号位置,第n-m+1 号位置上的小伙伴走到第 1 号位置,……,第 n-1 号位置上的小伙伴顺时针走到第m-1 号位置。

现在,一共进行了 10^k轮,请问 x 号小伙伴最后走到了第几号位置。

输入格式

输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。

输出格式

输出共 1 行,包含 1 个整数,表示 10

k 轮后 x 号小伙伴所在的位置编号。

 

样例君

输入

10 3 4 5

输出

5

说明

对于 30%的数据,0 < k < 7;

对于 80%的数据,0 < k < 10^7;

对于 100%的数据,1 <n < 1,000,000,0 < m < n,1 ≤ x ≤ n,0 < k < 10^9。

 

蒟蒻吐槽

  其实每个人(原位置为x)转圈后的位置其实就是(x+m*10^k)%n,就可以了。如果你喜欢的话,那个n可以定义成一个dalao的名字,在代码中%dalao有益AC啊(逃。言归正传,所求位置中我们唯一要求的就是10^k了,所以快速幂搞一下就可以了。代码附上。

 

代码

#include
#define LL long longint n,m,k,x;LL ans=1;LL pow(){ LL base=10; while(k!=0) { if(k%2)ans*=base; ans%=n; base*=base; base%=n; k/=2; }}int main(){ freopen("circle.in","r",stdin); freopen("circle.out","w",stdout); scanf("%d%d%d%d",&n,&m,&k,&x); pow(); printf("%lld",(m*ans+x)%n); return 0;}

 

转载于:https://www.cnblogs.com/mofangk/p/7737515.html

你可能感兴趣的文章
Mysql设置自增长主键的初始值
查看>>
Android计时器正确应用方式解析
查看>>
手机视频会议的实现
查看>>
性能及监控
查看>>
linux系统CPU、内存、硬盘、网络、lnmp服务整体监控邮件报警
查看>>
我的友情链接
查看>>
猴子吃桃问题
查看>>
个人总结问卷调查,头脑风暴,焦点小组的区别
查看>>
Ubuntu系统(十一)-MySql数据库安装与配置
查看>>
帝国网站系统目录说明
查看>>
为虚拟机提供FT
查看>>
Ubuntu12.04以及centos jdk7 32位安装 和设置tomcat监听内网地址
查看>>
使用命令修改注册表键值及权限
查看>>
Linux添加用户user到用户组group
查看>>
QQ聊天摘录 Odoo--Buy/Manufacture/Make To Order三个概念
查看>>
(转载)函数入栈顺序
查看>>
3.8-ansible playbook循环
查看>>
Nginx-rtmp模块实现流媒体play、push、pull功能
查看>>
关于STP根桥选择过程的思考
查看>>
vim随手记
查看>>