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

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

题意很简单,就是求\(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;
}

POJ1845的更多相关文章

  1. poj1845 Sumdiv

    poj1845 Sumdiv 数学题 令人痛苦van分的数学题! 题意:求a^b的所有约数(包括1和它本身)之和%9901 这怎么做呀!!! 百度:约数和定理,会发现 p1^a1 * p2^a2 * ...

  2. poj1845(逆元+快速幂)

    题目链接:https://vjudge.net/problem/POJ-1845 题意:求A的B次方的所有因子(包括1)的和对9901的模. 思路:首先对A利用唯一分解定理得A=p1x1*p2x2*. ...

  3. POJ-1845 Sumdiv---因子和(快速幂+快速加法+因子和公式)

    题目链接: https://cn.vjudge.net/problem/POJ-1845 题目大意: 求AB的因子和 解题思路: 先将A质因数分解,然后B次方的质因数指数就是乘上B即可 这里要mod9 ...

  4. 【题解】POJ1845 Sumdiv(乘法逆元+约数和)

    POJ1845:http://poj.org/problem?id=1845 思路: AB可以表示成多个质数的幂相乘的形式:AB=(a1n1)*(a2n2)* ...*(amnm) 根据算数基本定理可 ...

  5. [POJ1845&POJ1061]扩展欧几里得应用两例

    扩展欧几里得是用于求解不定方程.线性同余方程和乘法逆元的常用算法. 下面是代码: function Euclid(a,b:int64;var x,y:int64):int64; var t:int64 ...

  6. 【POJ1845】Sumdiv(数论/约数和定理/等比数列二分求和)

    题目: POJ1845 分析: 首先用线性筛把\(A\)分解质因数,得到: \[A=p_1^{a_1}*p_2^{a_2}...*p_n^{a_n} (p_i是质数且a_i>0) \] 则显然\ ...

  7. 约数之和(POJ1845 Sumdiv)

    最近应老延的要求再刷<算法进阶指南>(不得不说这本书不错)...这道题花费了较长时间~(当然也因为我太弱了)所以就写个比较易懂的题解啦~ 原题链接:POJ1845 翻译版题目(其实是AcW ...

  8. POJ1845 Sumdiv(求所有因数和+矩阵快速幂)

    题目问$A^B$的所有因数和. 根据唯一分解定理将A进行因式分解可得:A = p1^a1 * p2^a2 * p3^a3 * pn^an.A^B=p1^(a1*B)*p2^(a2*B)*...*pn^ ...

  9. poj1845 数论

    //Accepted 204K 16MS //约数和 //n=p1^e1*p2^e2***pk^ek //约数和为:(p1^0+p1^1+..+p1^e1)*(p2^0+p2^1+..+p2^e2)* ...

  10. POJ1845 数论 二分快速取余

    大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题思路: 应用定理主要有三个: (1)   整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. ...

随机推荐

  1. 《R数据挖掘入门》彩色插图(第9章)

    图9.5  图9.9

  2. 1.Spring MVC详解

    目录 1.SpringMVC 详细介绍 2.SpringMVC 处理请求流程 3.配置前端控制器 4.配置处理器适配器 5.编写 Handler 6.配置处理器映射器 7.配置视图解析器 8.Disp ...

  3. sftp 建立用户

    1.创建sftp组:#groupadd sftp 2.创建测试账户:#useradd -g sftp -s /bin/false testuser 修改密码:# passwd sftp 3.修改测试账 ...

  4. 【爬坑】DataNode 无法正常启动解决方案

    0. 说明 DataNode 无法正常启动的原因 & 解决方案 1. 原因一 在 start-all.sh 之后 DataNode 无法正常启动,单独启动也启动不了 可能的原因 多次格式化,导 ...

  5. SVN服务端VisualSVN数据转移说明

    两台服务器,进行SVN的迁移: 系统平台:windows server 2008 and windows server 2012 版本库:meishu 源服务器:192.168.0.245 目标服务器 ...

  6. 探索哪个进程使磁盘I/O升高

    如果生产环境中磁盘使用率突然升高,却不知道因为哪个应用程序导致的,这个时候我们可以使用pidstat命令来查看,比如 Linux .el7.x86_64 (ip.ec2.internal) _x86_ ...

  7. U890采购入库单修改供应商

    采购入库单表头 SELECT *FROM RdRecordWHERE (cCode = '0000051801') 采购入库单表体 SELECT *FROM RdRecordsWHERE (cPOID ...

  8. eclipse添加插件实现php的增删改查

    一:eclipse添加php插件 1.运行eclipse,在主界面里找到Help下的“Instal New Software”.然后在Work with中选择“All Available Sites” ...

  9. vue-cli打包到部署到nginx服务器

    最近公司把云平台产品用vue 前后端分离的框架来写,前面大部分开发都比较顺利,后面打包部署出了bug 现在记录下自己遇到的哪些坑 1,我直接npm run build 打包出来,打开dist目录下面的 ...

  10. 虚拟DOM与DOM diff算法

    虚拟DOM是什么? 一个虚拟DOM(元素)是一个一般的js对象, 准确的说是一个对象树(倒立的) 虚拟DOM保存了真实DOM的层次关系和一些基本属性,与真实DOM一一对应,如果只是更新虚拟DOM, 页 ...