题目链接

题意:求a^b的所有约数之和mod9901。

思路:因为一个数A能够表示成多个素数的幂相乘的形式。即A=(a1^n1)*(a2^n2)*(a3^n3)...(am^nm)。所以这个题就是要求

(1+a1+a1^2+...a1^n1)*(1+a2+a2^2+...a2^n2)*(1+a3+a3^2+...a3^n2)*...(1+am+am^2+...am^nm) mod 9901。

对于每一个(1+a1+a1^2+...a1^n1) mod 9901

等于 (a1^(n1+1)-1)/(a1-1) mod 9901,这里用到逆元的知识:a/b mod c = (a mod (b*c))/ b

所以就等于(a1^(n1+1)-1)mod (9901*(a1-1)) / (a1-1)。

至于前面的a1^(n1+1),快速幂。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
using namespace std;
int a,b,m,ans=,mod=;
int p[],c[];
void devide(int n)
{
m=;
for(int i=;i*i<=n;i++)
{
if(n%i==)
{
p[++m]=i;
c[m]=;
while(n%i==)
{
n/=i;
c[m]++;
}
}
}
if(n>)
p[++m]=n,c[m]=;
}
int power(int a,ll b)
{
int c=;
for(;b;b>>=)
{
if(b&)
c=(ll)c*a%mod;
a=(ll)a*a%mod;
}
return c;
}
int main()
{
scanf("%d%d",&a,&b);
devide(a);
for(int i=;i<=m;i++)
{
if((p[i]-)%mod==)
{
ans=((ll)b*c[i]+)%mod*ans%mod;
continue;
}
int x=pow(p[i],(ll)b*c[i]+);
x=(x-+mod)%mod;
int y=p[i]-;
y=power(y,mod-);
ans=(ll)ans*x%mod*y%mod;
}
printf("%d\n",ans);
}

最新文章

  1. struts的声明式异常处理
  2. grid列的值格式化
  3. apache安装错误error: APR not found解决办法
  4. PAT 06-2 字符串字母大小写转换
  5. 2分钟读懂Hadoop和Spark的异同
  6. Jquery选择器 讲解
  7. 【转】报错:Program &quot;sh&quot; not found in PATH
  8. [linux] 系统管理常用命令
  9. ZOJ问题--hdu3788
  10. Hibernate 系列教程6-双向多对多
  11. 201521123052《Java程序设计》第9周学习总结
  12. 基于winpcap的以太网流量分析器(java)
  13. ajax请求 readyState为0 可能原因之一
  14. Guava 教程2-深入探索 Google Guava 库
  15. java代理通俗简单解析
  16. RedHat Linux关闭防火墙的命令
  17. html5页面调用手机打电话功能
  18. Unity--game
  19. WGS84投影的WKID说明
  20. block原理

热门文章

  1. zookeeper分布式锁用法
  2. 《图解设计模式》读书笔记3-3 Builder模式
  3. 测开之路六十三:UI测试平台之视图层
  4. Django 的工作流程和基本内容
  5. 快速测试端口的连通性(HTTP/HTTPS)
  6. BigDecimal保留小数处理
  7. JavaScript DoublyLinkedList
  8. 爬取王垠的博客并生成pdf
  9. Django读写分离
  10. python学习第十天列表的增加,修改,删除操作方法