【题解】POJ 1995 Raising Modulo Numbers

Raising Modulo Numbers

题目传送门

(以下由DeepL翻译)

说明

人是不同的。有的人偷偷地看杂志,里面全是有趣的女孩的照片,有的人在地窖里制造原子弹,
有的人喜欢使用Windows,有的人喜欢高难度的数学游戏。
最新的市场调查显示,这个细分市场至今被低估,缺乏这类游戏。因此,这种游戏被纳入了KOKODáKH。
游戏规则如下:
每个玩家选择两个数字Ai和Bi 然后把它们写在纸条上. 其他人不能看到这些数字。
在特定的时刻,所有的玩家向其他人展示他们的数字。目标是确定包括自己在内的所有玩家的所有表达式${Ai}^{Bi}$的总和,
并确定除以给定数字M后的剩余部分。根据选手的经验,可以选择更高的数字来增加难度。

你应该编写一个计算结果的程序,并能够找出谁赢得了游戏。

输入

输入由Z个赋值组成。它们的数量由输入的第一行出现的单个正整数Z给出。
然后是赋值。每个赋值以包含整数M的行开始(1 <= M <= 45000)。
总数将被除以这个数字。下一行包含玩家数量H (1 <= H <= 45000)。
接下来正好是H行。在每一行中,有两个数字Ai和Bi用空格隔开。两个数字不能同时等于零。
(看不下去了qwq,意思就是先是 T组数据 ,然后 取余的数M, 然后 H个玩家, 在是Ai,Bi)

输出

对于每一个语句,只有一行输出。在这一行中,有一个数字,是表达式的结果。

[({A1}^{B1}+{A2}^{B2}+...+{AH}^{BH})mod M ]

采样输入

3
16
4
2 3
3 4
4 5
5 6
36123
1
2374859 3029382
17
1
3 18132

采样输出

2
13195
13

资料来源

1999年CTU公开赛

思路分析:

就没什么好说的。直接套快速幂。

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll; typedef unsigned long long ull;

int T;
ll a, b, p, n, ans;

inline int qpm(ll a, ll b, ll p) {
    ll ans = 1 % p, t = a % p;
    while(b) {
        if(b & 1) ans = ans * t % p;
        t = t * t % p;
        b >>= 1;
    }
    return ans;
}

int main(){
    scanf("%d", &T);
	while(T --) {
		ans = 0;
		scanf("%lld%lld", &p, &n);
		for(int i = 0; i < n; i ++) {
			scanf("%lld%lld", &a, &b);
			ans = (ans+qpm(a, b, p)) % p;
		}
		printf("%lld
", ans);
	}
    return 0;
}
原文地址:https://www.cnblogs.com/RemnantDreammm/p/14125863.html