这还是一道综合了许多数论的知识点的,做完也涨了不少姿势

但还是因为约数和公式这个鬼东西去找了度娘

题意很简单,就是求\(A^B\)的约数之和\(mod\ 9901\)。

但是这种题意越是简单的题目越是坑人

首先如果你不知道约数和公式就绝逼GG,然后由于有唯一分解定理这种东西撑腰,我们选择直接用公式.

先分解质因数得到\(n\)个质因数\(p_i\)和它们出现的次数\(t_i\),然后约数和:

\(\prod_{i=1}^{n} \sum_{j=0}^{t[i]} {p_i}^j\)

然后我们考虑如何处理那个\(\sum_{j=0}^{t} {p}^j\)

首先我们可以发现这是一个等比数列,然后我们来对它进行转化,我们设\(S=\sum_{j=0}^{t} {p}^j ......(1)\),则有

\(pS=\sum_{j=1}^{t+1} {p}^j ......(2)\)

我们\((2)-(1)\)得

\((p-1)S=p^{t+1}-1\)

\(S=\frac{p^{t+1}-1}{p-1}\)

所以我们上面用快速幂,下面用逆元即可,然后就解决了

但其实这道题的坑点让人难以想象:

  1. 当\(9901\mid p-1\)时不能用逆元,要特殊处理
  2. 因为这道题的次数不能取模,所以要涉及到两个long long的数相乘,但是由于取模所以不用高精,所以我们用二进制的方法(其实就是和快速幂一样的思想)来做快速乘
  3. 分解质因数的时候这个数可能本身就是质数(这个比较经典)

然后我们就可以艹过去了

CODE

#include<cstdio>
using namespace std;
typedef long long LL;
const LL S_N=10005,mod=9901;
LL a,b,prime[S_N],t[S_N],ex,cnt,ans=1;
bool vis[S_N];
inline void Euler(LL m)
{
register LL i,j; vis[1]=1;
for (i=2;i<m;++i)
{
if (!vis[i]) prime[++cnt]=i;
for (j=1;j<=cnt&&i*prime[j]<m;++j)
{
vis[i*prime[j]]=1;
if (!(i%prime[j])) break;
}
}
}
inline void resolve(LL x)
{
register LL i;
for (i=1;i<=cnt;++i)
{
while (!(x%prime[i])) x/=prime[i],++t[i];
if (!(x^1)) break;
}
if (x^1) ex=x;
}
inline LL quick_mul(LL x,LL y,LL mod)
{
LL tot=0;
while (y)
{
if (y&1) tot=(tot+x)%mod;
x=(x<<1)%mod; y>>=1;
}
return tot;
}
inline LL quick_pow(LL x,LL p,LL mod)
{
LL tot=1;
while (p)
{
if (p&1) tot=quick_mul(tot,x,mod);
x=quick_mul(x,x,mod); p>>=1;
}
return tot;
}
inline LL inv(LL x)
{
return quick_pow(x,mod-2,mod);
}
inline LL calc(LL p,LL t)
{
return (((quick_pow(p,t,mod)-1+mod)%mod)*inv(p-1))%mod;
}
int main()
{
Euler(S_N); scanf("%lld%lld",&a,&b); resolve(a);
for (register LL i=1;i<=cnt;++i)
if (t[i])
{
if ((prime[i]-1)%mod) ans=(ans*calc(prime[i],t[i]*b+1))%mod;
else ans=(ans*quick_pow(prime[i],t[i]*b+1,mod*(prime[i]-1))/(prime[i]-1))%mod;
}
if (ex)
{
if ((ex-1)%mod) ans=(ans*calc(ex,b+1))%mod;
else ans=(ans*quick_pow(ex,b+1,mod*(ex-1))/(ex-1))%mod;
}
printf("%lld",ans);
return 0;
}

最新文章

  1. window.open打开新窗口被浏览器拦截的处理方法
  2. Storm实时计算框架的编程模式
  3. 一个Linq
  4. 十大Intellij IDEA快捷键(转)(2015年06月15日)
  5. spring利用注解来注册bean到容器
  6. 关于JDK中的集合总结(二)
  7. SDUT 2523 OOXX
  8. linux 用grep匹配横线
  9. EF5修改edmx表结构保存后不自动更新tt (转)
  10. iOS 实现UIImageView 的不停的旋转(更新:2017.7.26)
  11. iOS开发中UIPopoverController的使用详解
  12. js表单验证处理和childNodes 和children 的区别
  13. C++读写图片数据转成Base64格式
  14. vi怎么统计查找字符串的个数
  15. activeMq-3 Spring整合activeMq
  16. flow-vue.js移动端效果
  17. MySQL调优基础, 与hikari数据库连接池配合
  18. podSpec文件相关知识整理
  19. *args and **kwargs
  20. 【BZOJ】1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛(lis)

热门文章

  1. cmake:善用find_package()提高效率暨查找JNI支持
  2. 安卓界面之Toolbar上手
  3. 对Spring的理解(简单)!
  4. BOM 清除
  5. 第六章 Hyper-V 2012 R2 的检查点
  6. 描述性统计的matlab实现
  7. python学习-判断是否是私网IP地址
  8. Java设计模式之五 ----- 外观模式和装饰器模式
  9. 线程间的通信_多生产者多消费者问题_JDK1.5新特性_Lock
  10. pymysql使用(二)