• NOIP 2013 转圈游戏


    【题目描述】

    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 号小伙伴所在的位置编号。

    很容易把式子列出来,

    x+M*10^k%n

    然后答案显然了。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cstdlib>
    #define MAXN 100010
    #define in(a) a=read()
    #define REP(i,k,n) for(int i=k;i<=n;i++)
    using namespace std;
    inline long long read(){
        long long x=0,f=1;
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar())
            if(ch=='-')
                f=-1;
        for(;isdigit(ch);ch=getchar())
            x=x*10+ch-'0';
        return x*f;
    }
    long long n;
    long long m,x,k;
    long long ksm(long long a,long long b){
        long long ans=1;
        while(b){
            if(b%2==1)  ans=((ans%n)*(a%n))%n;
            a=(a*a)%n;
            b/=2;
        }
        return ans%n;    
    }
    int main(){
        in(n),in(m),in(k),in(x);
        cout<<(x+(m*ksm(10,k)%n))%n;
        return 0;
    }
  • 相关阅读:
    RMAN备份脚本
    配置putty隧道登录远程window远程或远程数据库
    ssh登录报错:no common kex alg
    Solaris上修改进程能够打开的最大文件句柄数
    如何在V890上安装配置rsc(转)
    Oracle表或分区导出脚本
    检查日期合法性脚本(转)
    Solaris下常用的磁带操作命令
    如何从solaris操作系统上获取机器的sn号
    如何修复failed磁盘和"DISABLED RECOVER"状态的plex
  • 原文地址:https://www.cnblogs.com/jason2003/p/10470863.html
Copyright © 2020-2023  润新知