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

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

题意很简单,就是求\(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. Python实现批量梯度下降算法

    # -*- coding: UTF-8 -*- import numpy as npimport math # 定义基础变量learning_rate = 0.1n_iterations = 1000 ...

  2. maven(六),外置maven运行环境配置

    外置maven eclipse内置的maven插件是固定版本,如果要用其他版本的maven,可以使用外置maven 下载地址: http://maven.apache.org/download.cgi ...

  3. win7系统保护配置现错误“文件名、目录名或卷标语法不正确。(0x8007007B)

    windows7下系统保护功能很是鸡肋,有事会出现一下两个问题: 1.出现错误“文件名.目录名或卷标语法不正确.(0x8007007B) 2.保护设置列表中出现“Windows7_os(c:)(找不到 ...

  4. Ubuntu + python pip遇到的问题

    今天在做Flask跨源资源共享(CORS)的时候在安装flask-cors时遇到了两个问题. 首先我是在Ubuntu环境下安装的,整了好一会才弄得出来,现在整理一下. 安装flask-cors pip ...

  5. tkinter学习系列之(八) Canvas控件

    目录 目录 前言 (一)carves创建方法 (二)carves的画图方法 目录 前言 由于最近想在tkinter里内嵌matplotlib,由于用到tkinter里的carves控件,先学习一下. ...

  6. JAVA中实现单例(Singleton)模式的八种方式

    单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 基本的实现思路 单 ...

  7. PyQt5 + QtDesigner

    看到网上蛮多介绍做界面开发时可以借助QtDesigner进行快速完成布局,搞了半天在电脑里却找不到该工具,网上查了一下,原来是要额外安装一个pyqt5的工具包,下面结合亲身一步一步操作记录下来,也方便 ...

  8. 【BZOJ3529】数表

    数表 Description 有一张 n*m 的数表,其第i行第j列(1<=i<=n,1<=j<=m)的数值为能同时整除 i和j的所有自然数之和.给定a,计算数表中不大于a的数 ...

  9. Android 怎样开启与关闭adb 的认证机制(google adb secure) (adb RSA 指纹认证)

    前言         欢迎大家我分享和推荐好用的代码段~~声明         欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net           ...

  10. Excel函数详解:[127]ROWS函数用法

    函数说明 1 函数语法: ROWS(array) 2 参数说明: array:表示要返回行数的数组.数组公式或单元格引用. END 函数实例-计算项目的数量   在B12单元格中输入公式“=ROWS( ...