题目大意:
给出
Z
Z
组数,每组包括一对,以及
H
H
对,
对于每组数请回答,
(AB11+AB22+…+ABh−1h−1+ABhh)mod
(
A
1
B
1
+
A
2
B
2
+
…
+
A
h
−
1
B
h
−
1
+
A
h
B
h
)
m
o
d
M
M
的结果
1≤M≤45000
1
≤
M
≤
45000
分析:
将
B
B
转化成二进制表示,可以得到
那么显然
AB
A
B
就可以转化成
a∗c020+a∗c121+…+a∗ck−12k−1+a∗ck2k
a
∗
c
0
2
0
+
a
∗
c
1
2
1
+
…
+
a
∗
c
k
−
1
2
k
−
1
+
a
∗
c
k
2
k
那么就可以在
log2(B+1)
l
o
g
2
(
B
+
1
)
的时间内处理出
AB
A
B
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
int mul(int x, int y, int MOD)
{
int num = 1 % MOD;
for (; y; y >>= 1)
{
if (y & 1) num = (ll)num * x % MOD;
x = (ll)x * x % MOD;
}
return num;
}
int main()
{
int T, n, MOD;
scanf("%d", &T);
while (T--)
{
scanf("%d", &MOD);
scanf("%d", &n);
int a, b, sum = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d %d", &a, &b);
sum = (sum + mul(a, b, MOD)) % MOD;
}
printf("%d\n", sum);
}
}