O(1)求幂
查看原帖
O(1)求幂
664236
Pursuewind楼主2023/11/24 22:54

洛谷网校出版的《深入浅出程序设计竞赛》提高篇中把这道题改成了:给定 a,ca,c,有 qq 次询问,每次询问给出 bb,请你输出 ab mod ca^b \bmod c。书上提到了这道题的 O(q)O(q) 解法。及运用公式:

ab=(ac)⌊bc⌋×ab mod ca^b=(a^{\sqrt{c}})^{\left\lfloor\frac{b}{\sqrt{c}}\right\rfloor} \times a^{b \bmod \sqrt{c}}

于是之用预处理 (ac)i(a^{\sqrt{c}})^i 和 aja^j(0≤i≤2c0 \le i \le 2\sqrt{c},0≤j≤c0 \le j \le \sqrt{c})即可做到 O(q)O(q)。

于是我编写了如下代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e7;
int A[N], B[N];
/*
ai=a^{sqrt(c)}^i
bi=a^i
*/
int q, a, c;
int sqrtc;
int qpow(int a, int b)
{
	int res = 1, base = a;
	while (b)
	{
		if (b & 1) res *= a;
		base *= base;
		b >>= 1;
	}
	return res;
}
void init()
{
	int f = qpow(a, sqrtc);
	A[0] = B[0] = 1;
	for (int i = 1; i <= (sqrtc << 1) + 1; i ++)
		A[i] = A[i - 1] * f % c;
	for (int i = 1; i <= sqrtc + 1; i ++)
		B[i] = B[i - 1] * a % c;
}
signed main()
{
	cin >> q >> a >> c;
	sqrtc = sqrt(c);
	init();
	while (q --)
	{
		int b;
		cin >> b;
		cout << ((A[b / sqrtc] % c) * (B[b % sqrtc] % c)) % c << endl;
	}
	return 0;
}

输入:

2 2 5
3
4

应输出:

3
1

但是我的程序输出了:

4
4

请问问题出在哪里?

2023/11/24 22:54
加载中...