题目描述

输入两个整数 a 和 b,求 aba^bab 的因子和。

由于结果太大,只要输出它对 9901 取模的结果。

输入格式

仅一行,为两个整数 a和 b。

输出格式

输出一行一个整数表示答案对 9901 取模的结果。

输入输出样例

输入 #1复制
2 3
输出 #1复制
15

说明/提示

数据规模与约定

对于全部的测试点,保证 1≤a≤5×10710^7107,1≤b≤5×10710^7107 。

解题思路

1、{分解质因子}
首先,看到题目要求的数据,就已经确定是无法使用暴力的,那么根据以往的经验,我们就要求解整数a的质因子,并求解出每个质因子的个数,然后再让该质因子的个数乘以b就是对于aba^bab这个数中分解出来的每一个质因子的个数。

eg:
414^141中 质因子2的个数就是2*1=2个
424^242中 质因子2的个数就是2∗22*22∗2=4个
434^343中 质因子2的个数就是2∗32*32∗3=6个

(本题使用数组进行存储即可)

2、{等比数列求和}
     然后我们对求解出的质因子进行分析,不难发现,假设当前质因数为m,质因数的个数为n,那么mnm^nmn,肯定aba^bab的一个因子而且是以m为底数的最大因子。

eg:
16能分解的因子分别是:1,2,4,8,16.
由上述思路1可知16的质因子的个数是4,也就是我们以2为底数最大的该数的因子就是242^424=16,与此同时,我们可以发现16的因子和就等于=1+212^121+222^222+232^323+242^424。

也就是说对于aba^bab可以分解的质因数,这个数因子和的一部分就等于m从0到n次幂的和。

综上所述,我们求解该数的因子和就等于(借图一用,感谢!)

这里的pi就相当于可以拆解的质因子,ci就代表该数可以分解得到的当前之因子的个数。

看到这里,结合高中的知识,就将问题转化为等比数列求和。
等比数列求和公式:

在本题中a1均为1,q代表质因子的值,n代表每一个质因子的个数。

将相关数据代入 q=m(质因子的值),n(等比数列的项数)=n(质因子的个数)+1。进而推出:

看到上面的pici+1pi^{ci+1}pici+1我们就会想到快速幂,直接套用模板就可以。

3、{费马小定理求逆元}
最后,我们看题中所给的条件,题目中让我们对结果数对9901进行取余,为什么要对这么特别的数字进行取余呢?可以发现9901是一个素数,再观察上面等比数列求和的公式,发现我们还有 /(pi-1)没有进行处理,这时就要想到求逆元。


也就是说除以一个数,换做乘以这个数的倒数的结果是不变的,再根据费马小定理的公式有:

带入公式求解快速幂即可。

注意

1、首先,为了防止取模的时候是负数,可以先将其+mod再进行取模。

2、为什么求解等比数列求和的每一次求解第一项都是1而不是m(m代表当前质因子)?
这也是我最初没有想明白的地方。后来找到了题解中的这一部分:(为大佬点赞!!!)
3、为什么要考虑质因子 (m%9901)==1是否成立?
    因为如果有个质因子m,m%9901=1,那用费马小定理求逆元的时候,(m-1)%9901=0,这时候不存在逆元(0是没有倒数的),所以会出错。那么试想,我们m%9901=1,那式子(1+m+m2m^2m2+…+mcntm^{cnt}mcnt) 是不是就等于cnt+1?(因为里面每一项mim^imi(0<=i<=n)mod 9901之后都是1),所以计算需要特判!!!

完整代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=9901;
int yin[10010][2];//0下标对应因子,1下标代表该因子的个数
int cnt=0;ll qpow(ll a,ll b)//矩阵快速幂
{ll res=1;while(b){if(1&b) res=((ll)a*res)%mod;a=(ll)a*a%mod;b>>=1;}return res;}int main()
{ll m,n;scanf("%lld %lld",&m,&n);for(int i=2;i<=m/i;i++)//求解该数的质因子 {if(m%i==0){while(m%i==0){m/=i;    yin[cnt][1]++;}yin[cnt][0]=i;yin[cnt][1]*=n;//因为是要求m的n次幂,所以我们在此处因子的个数时也要乘以相应的倍数 cnt++; }   }if(m>1)//该质因子大于根号n {yin[cnt][0]=m;yin[cnt][1]=n;cnt++;//为了下面的循环,必须要让在循环数组的下标小于cnt,因此需要进行++ } ll ans=1;for(int i=0;i<cnt;i++){   //前半部分求解的是等比数列求和,为了防止是负数,要加上mod在进行取余 ll t=(qpow(yin[i][0],yin[i][1]+1)+mod-1)%mod*qpow(yin[i][0]-1,mod-2)%mod;//第二部分是使用费马小定理求解q-1的逆元 if(yin[i][0]%mod==1)//如果说因子对9901取余的余数是1,那么该因子-1对9901取余的结果就是0,那么此时就不存在逆元,此时就变成因子个数+1个1相加 {ans=ans*(yin[i][1]+1)%mod;}else ans=ans*t%mod;} printf("%lld",ans);return 0;} 

洛谷 [P1593 因子和] {快速幂+费马小定理求逆元+求解质因子} 奋斗的珂珂~相关推荐

  1. 数学--数论--费马小定理+求逆元

    1.费马小定理: (此处的p为素数) 证明: 费马小定理求逆元 如果p为小素数我们选择直接暴力,时间复杂度为: int Fermat_inverse(int a,int mod) {int res = ...

  2. HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)

    Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) ...

  3. HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)

    题目链接:点击查看 题目大意:给出函数f(x): 现给出n,a,b,c,mod,求f(n)对mod取模后的结果 题目分析:这个题目相对于前几个题来说稍微加大了点难度,但还是挺水的一个题,首先我们可以对 ...

  4. HDU 4549 M斐波那契数列(矩阵快速幂费马小定理)

    ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 T ...

  5. 51nod 1013快速幂 + 费马小定理

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1013 这是一个等比数列,所以先用求和公式,然后和3^(n+1)有关,有n ...

  6. Codeforces 696C. PLEASE(快速幂+费马小定理)

    题目链接 题目大意 三个杯子,硬币一开始在中间的杯子里,每次操作可能是左边和中间或右边和中间交换,问n次操作后,硬币在中间的概率 思路 设 f(n) f(n) 是n次操作后硬币在中间的概率,则很明显, ...

  7. 数论--费马小定理求逆元

    ACM常用模板合集 int Fermat_inverse(int a,int mod) {int res = 1;for(int i = 1;i < mod - 1;++i) res *= a; ...

  8. 第十四届华中科技大学程序设计竞赛 B Beautiful Trees Cutting【组合数学/费马小定理求逆元/快速幂】...

    链接:https://www.nowcoder.com/acm/contest/106/B 来源:牛客网题目描述 It's universally acknowledged that there're ...

  9. Detachment HDU - 5976(数学+费马小定理求逆元+前缀和前缀积)

    题意:给定一个数,让你分成互不相等的n个数(n为自然数),使这些数的乘积最大,输出最大乘积. 题解:本文参考传送门 首先:那就是不能分出1来,因为1乘任何数都是它本身,而因为分出了1,另一部分也变小了 ...

最新文章

  1. Java类中的权限修饰符
  2. 常见排序算法效率比较
  3. 【Java例题】4.3 3. 使用Gauss消元法求解n元一次方程组的根,
  4. sdut 3333 数据结构实验之栈与队列六:下一较大值(二)
  5. 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能
  6. SiamNet: 全卷积孪生网络用于视频跟踪
  7. hdu4746(莫比乌斯反演)
  8. SAP SMP的一些截图
  9. LeetCode 257. 二叉树的所有路径 思考分析
  10. Revit二次开发 - C#程序员的佳好选择
  11. 调查 1621 万互联网人:发现技术人基本是男性,还一半都单身
  12. 单片机C语言PWM程序原理,单片机C语言程序设计:用 ADC0808 控制 PWM 输出
  13. linux基本命令示例_Linux正常运行时间命令示例
  14. 【5分钟 Paper】Deep Recurrent Q-Learning for Partially Observable MDPs
  15. Cassandra安装和初次使用
  16. 蒙特卡洛思想(Monte Carlo思想)
  17. OpenGL 与显卡
  18. Linux 硬盘初始化
  19. 【MySQL】MyCAT三大配置文件详解(MySQL专栏启动)
  20. 最新爆料 !公众号很有必要接入微社区吗?

热门文章

  1. 汽车VIN码识别功能实现资料,轻松实现VIN码识别
  2. php jq实现抽奖,php 实现抽奖功能
  3. 2021年中国官方储备资产规模及分布:外汇储备资产占94.84%[图]
  4. 牛客华为机试题刷题笔记总结[103题更新完毕才收尾,建议关注收藏]
  5. Image Processing and Computer Vision_Review:Local Invariant Feature Detectors: A Survey——2007.11...
  6. windows下服务器的数据的迁移解决方案
  7. 京东12年被裁,昨天赔偿到账了,加调休和年假总共47万多,感谢公司!
  8. 怎样把经纬度坐标转换为空间直角坐标
  9. WEB服务及WSDL
  10. 中兴通讯提前批综合面试