当前位置: 代码迷 >> 综合 >> Part6.1 数学基础-快速幂
  详细解决方案

Part6.1 数学基础-快速幂

热度:96   发布时间:2023-12-02 15:04:08.0

Part6.1 数学基础-快速幂

  • 快速幂模板
  • [A序列的第 k 个数](https://ac.nowcoder.com/acm/contest/977/A)
  • [B A 的 B 次方](https://ac.nowcoder.com/acm/contest/977/B)
  • [C 转圈游戏](https://ac.nowcoder.com/acm/contest/977/C)
  • [D 越狱](https://ac.nowcoder.com/acm/contest/977/D)

快速幂模板

LL qmi(int a, int b)
{
    LL ans = 1;while (b){
    if (b & 1) ans = ans * a % mod;a = a * a % mod;b >>= 1;}return ans;
}

A序列的第 k 个数

快速幂模板题

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>using namespace std;#define int long long
const int mod = 200907;int qmi(int a, int b)
{
    int res = 1;while (b){
    if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}void solve()
{
    int a, b, c, k;cin >> a >> b >> c >> k;if (b - a == c - b){
    cout << (a + (k - 1) * (b - a)) % 200907<< endl;}else{
    int q = b / a;cout << (a * qmi(q, k - 1)) % 200907 << endl;}
}signed main()
{
    int T; cin >> T;while (T -- ){
    solve();}return 0;
}

B A 的 B 次方

模板题,直接背过。
注意m==1的时候这种特殊情况

#include <bits/stdc++.h>using namespace std;#define int long longint a, b, mod;int qmi(int a, int b)
{
    int ans = 1 % mod;while (b){
    if (b & 1) ans = ans * a % mod;a = a * a % mod;b >>= 1;}return ans;
}
signed main()
{
    cin >> a >> b >> mod;cout << qmi(a, b) << endl;return 0;
}

C 转圈游戏

还是模板,感觉用到了加法公式,但是后来看别人的代码用不着。
其实,mod的那个n,就已经让次数很小了,可以不用在使用一次加法了。

#include <bits/stdc++.h>using namespace std;#define int long longint n, m, k, x;int qmi(int a, int b, int mod)
{
    int res = 1;while (b){
    if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}
int mul_qmi(int a, int b, int mod)
{
    int res = x % mod;while (b){
    if (b & 1) res = (res + a) % mod;a = (a + a) % mod;b >>= 1;}return res;
}
signed  main()
{
    cin >> n >> m >> k >> x;int cnt = qmi(10, k, n);cout << mul_qmi(m, cnt, n) << endl;return 0;
}

D 越狱

每个人都可能有m中信仰,一共n个人,一共就是m ^ n
答案为总的减去不重复的
不重复的:第一个人有m中选择, 那么第二个人到第n个人都是有m-1中选择
所以,答案为m ^ n - m * (m - 1) ^ (n - 1)

#include <bits/stdc++.h>using namespace std;#define int long longconst int mod = 100003;int m, n;int qmi(int a, int b)
{
    int res = 1;while (b){
    if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}signed main()
{
    cin >> m >> n;// cout << (n - 1) * qmi(m, n - 1) % mod << endl;cout << (qmi(m, n) - m * qmi(m - 1, n -  1) % mod + mod) % mod << endl;return 0;
}