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;
}