Skip to content

11574: 【原1574】调皮的助教

题目

题目描述

author: Mickeypeng 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1574

Description

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(10的k次方)次作业,请问x号助教下次出题的题号。

Input Format

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

Output Format

输出共1行,包含1个整数,表示10^k(10的k次方)轮后x号助教下次出题的题号。

Sample Input

10 3 4 5

Sample Output

5

Limits

  • 对于30%的数据,0<𝑘<7;
  • 对于80%的数据,0<𝑘<107;
  • 对于100%的数据,1<𝑛<1,000,000,0<𝑚<𝑛,1≤x≤n,0<𝑘<1,000,000,000。

ligongzzz's solution

#include "iostream"

using namespace std;

int main() {
    long long n, m, k, x;
    cin >> n >> m >> k >> x;

    //计算10的i次方的余数
    long long base = 10 % n;
    long long result = 1;
    while (true) {
        long long temp = k % 10;
        for (int i = 0; i < temp; i++)
            result = result * base%n;
        k = k / 10;
        if (k == 0)
            break;
        //修改base的值
        long long baseTemp = base;
        for (int i = 0; i < 9; i++) {
            base = base * baseTemp % n;
        }
    }

    m = m * result%n;

    cout << (x + m) % n;

    return 0;
}

Neight99's solution

#include <cmath>
#include <iostream>

using namespace std;

int mods(int, int, int);

int main() {
    long long Answer;
    int n, m, k, x;

    cin >> n >> m >> k >> x;
    Answer = m * mods(10, k, n);
    Answer %= n;
    Answer += x;
    Answer %= n;
    cout << Answer << endl;

    return 0;
}

int mods(int x, int y, int n) {
    int Answer = 1;
    x %= n;
    while (y > 0) {
        if (y & 1) {
            Answer *= x;
            Answer %= n;
        }
        y /= 2;
        x = (x * x) % n;
    }

    return Answer;
}

yyong119's solution

#include<iostream>

using namespace std;

int PowerMod(long long a, long long b, long long c) {

    long long ans = 1;
    a %= c;
    for (; b; b >>= 1) {
        if (b % 2) ans = (ans * a) % c;
        a = a * a % c;
    }
    return ans % c;
}

int main() {

    ios::sync_with_stdio(false);

    long long n, m, k, x;
    cin >> n >> m >> k >> x;

    long long ans = PowerMod(10, k, n);
    ans = (ans * m % n + x) % n;
    cout << ans;

    return 0;
}