• 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;
    }
  • 相关阅读:
    RSDS pdb格式
    关于windbg报错"No symbols for ntdll. Cannot continue."问题
    WinDbg常用命令系列---.cmdtree
    正确创建本地C++发布构建PDBS
    PDB文件会影响性能吗?
    每个开发人员必须知道PDB文件知识
    Windbg妙用
    在x64计算机上捕获32位进程的内存转储
    为什么我的堆栈上会有奇怪的函数名?(关于符号的讨论)
    redis入门基础
  • 原文地址:https://www.cnblogs.com/dijkstra2003/p/10470863.html
Copyright © 2020-2023  润新知