<题目链接>

注意:这可能也是一道模板题。

注意2:$p=998224352$

注意3:对于$100\%$的数据,$n\leq 5 \times 10^6$

这个题很启发思路,如果直接快速幂应该会T飞(不过还是看到卡常大师$997ms$过……)。

所以

法一:直接快速幂

复杂度:$\Theta(N \log p)$

不多说直接快速幂即可。

法二:神奇分块思路

由于询问比较多,我们考虑预处理。

假设我们处理到$k$.

我们在指数上化柿子。

有:

$$\large x^y=x^{y\, \mod\, k }\times x^{\left\lfloor\frac{y}{k}\right\rfloor \times k}$$

然后就可以$\Theta(1)$回答了

预处理是$\Theta(k+\frac{p}{k})$的

于是取$k=p^{\frac{1}{2}}+1$可以达到最优复杂度$\Theta(p^{\frac{1}{2}}+N)$($+1$是为了防止$\sqrt{p}$取整精度跪掉)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath> using namespace std;
const int Mod = 998244352, Sqrt = 31596;
long long val[32000], van[32000], vd, qn;
int main() {
long long q;
scanf("%lld%lld", &vd, &qn);
val[0] = 1;
val[1] = vd % Mod;
for (int i = 2; i <= Sqrt; i++) val[i] = val[i - 1] * vd % Mod; // cout<<val[i]<<" ";
van[0] = 1;
van[1] = val[Sqrt];
for (int i = 2; i <= Sqrt; i++) van[i] = van[i - 1] * val[Sqrt] % Mod;
for (int i = 1; i <= qn; i++) {
scanf("%lld", &q);
// cout<<q%Sqrt<<" "<<q/Sqrt<<endl;
// cout<<val[q%Sqrt]<<" "<<van[q/Sqrt]<<endl;
printf("%lld ", val[q % Sqrt] * van[q / Sqrt] % Mod);
}
puts("");
}

不得不说格式化代码令人兴奋……

最新文章

  1. NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
  2. php安装memcache注意事项
  3. 一些常见maven仓库
  4. Hudson可扩展持续集成引擎
  5. android92 aidl远程进程通信
  6. mybatis中几种typeHandler的定义使用
  7. sql常用的日期函数与应用
  8. inet_aton等函数
  9. hdu 4803 贪心/思维题
  10. Node.js/Vue环境搭配安装
  11. Effective Java 第三版——31.使用限定通配符来增加API的灵活性
  12. DirectX11 With Windows SDK--00 目录
  13. 【转】Zookeeper 安装和配置
  14. MNIST机器学习进阶
  15. 章节六、3-读取Properties属性文件
  16. [ipsec][strongswan] 用strongswan pki工具生成自签名证书
  17. vue VNode如何使用,是什么东西?
  18. flexbox与grid layout的区别
  19. 绑定任意格式的XML文档到WPF的TreeView
  20. thymeleaf的使用

热门文章

  1. STM32笔记——Power Controller(PWR)
  2. 01_springboot2.x之springboot入门
  3. &lt;jquery&gt;滚动例子
  4. sql server2014显示sa无法登录的错误
  5. 13-2-return
  6. input 不显示输入的历史记录
  7. Windows相关命令
  8. data方法也是模型类的连贯操作方法之一,
  9. Python-面向对象之高级进阶
  10. 容斥原理——poj1091