因子和

题目描述

输入两个正整数a和b,求\(a^b\)的因子和。结果太大,只要输出它对9901的余数。

解法

基本算数定理,每一个数都可以被分解成一系列的素数的乘积,然后你可以分解出因数了。

如何求出因数和呢?我们发现是等比数列,之后我们上等比数列求和公式就好了

\[S_n = \frac{a_1 \times (1-q^n)}{1-q}=\frac{p_{i}^{c_i+1} -1}{p_i -1}
\]

其中我们可以用快速幂和逆元求出来了

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
#include <cmath>
#define LL long long
using namespace std;
const LL mod = 9901;
LL ksm(LL x,LL y) {
LL z=1;
while(y) {
if(y&1) z=(z*x)%mod;
y>>=1;
x=(x*x)%mod;
}
return z%mod;
}
LL to[2],get=1;
int main() {
LL a=0,b=0,tmp,lim;
scanf("%lld%lld",&a,&b);
lim=sqrt(a);
for(LL i = 2; i <= lim; i ++) {
if(!(a%i)) {
tmp=0;
while(!(a%i)) {
a/=i;
tmp++;
}
to[1]=(tmp*b+1);
if(i%mod==1) get=get*(tmp+1)%mod;
else {
to[0]=i%mod;
get=get*(ksm(to[0],to[1])-1)*ksm(to[0]-1,mod-2)%mod;
}
}
}
if(a!=1) {
to[1]=(b+1);
if(a%mod==1)get=get*(b+1)%mod;
else {
to[0]=a%mod;
LL k=(ksm(to[0],to[1])-1)*ksm(to[0]-1,mod-2)%mod;
get=get*k%mod;
}
}
printf("%lld",get);
return 0;
}

最新文章

  1. jq 全选和反选以及判断那条被选中
  2. LINUX数据库的备份,以及远程授权登陆
  3. powershell 参数 [String]Service
  4. 研磨设计模式解析及python代码实现——(三)适配器模式(Adapter)
  5. View Controller 生命周期的各个方法的用法
  6. ajax请求相关方法
  7. CascadeType
  8. 富文本,NSAttributedString,当需要改变的内容有相同的时候的解决方法
  9. FixedUpdate真的是固定的时间间隔执行吗?聊聊游戏定时器
  10. GitHub 系列之「Git速成」
  11. Opencv(C++)实现邻近插值算法
  12. bs4解析库
  13. java学习之路--I/O流
  14. MAC安装JDK及环境变量配置
  15. Android-自定义View前传-View的三大流程-Layout
  16. JAVA自学笔记07
  17. 针对mysql delete删除表数据后占用空间不变小的问题
  18. [skill][c] *(char**)
  19. ipfs docker 运行试用
  20. 并发编程 —— Timer 源码分析

热门文章

  1. javascript中构造函数的三种方式
  2. Sql Server 优化----SQL语句的执行方式与锁以及阻塞的关系
  3. java学习笔记1——继承
  4. PhotoZoom Pro 7怎么进行参数设置
  5. 创建一个dynamics CRM workflow (一) - Introduction to Custom Workflows
  6. Js中判断变量存不存在的问题
  7. DNS解析过程详解(转载)
  8. linux下载命令wget
  9. python3发送邮件
  10. mysql 与 memcache 字段名后面有空格时会产生什么问题(转)