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

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

题意很简单,就是求\(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 获取被调用函数名称,所处模块,被调用代码行

    获取被调用函数名称,所处模块,被调用代码行 by:授客 QQ:1033553122 module2.py: #!/usr/bin/env python # -*- coding:utf-8 -*- _ ...

  2. solr搜索引擎配置使用mongodb作为数据源

    环境说明: 操作系统:由于是使用的docker直接拉取的镜像部署的,系统是LINUX环境 mongodb: 4.0.3 solr: 7.5.0 python: 3.5 配置mongodb 1.拉取mo ...

  3. knockoutjs关于ko.bindingHandlers的updata订阅

    ko.bindingHandlers是先执行init进行初始化数据的绑定(如果需要执行updata进行数据更新可以不用初始化); init: function(element, valueAccess ...

  4. VSCode + PYQT5 + QtDesigner 环境搭建和测试

    目的:编写Python桌面应用程序. 备注:也可以选择VS2017+QtDesigner ,但更喜欢VSCode 第1步:安装PyQt5和PyQt5-tools pip3 install -i htt ...

  5. 关于解决JetBrains 激活问题

    今天升级了下JetBrains 的一系列产品,安装后打开发现以前的激活失效了. 在网上看到网友们各类屏蔽和寻找服务器,尝试了下都不太方便. 最后去rover的个人博客看了下,很给力,总能跟上JetBr ...

  6. Python读取PE文件(exe/dll)中的时间戳

    代码原文地址: https://www.snip2code.com/Snippet/144008/Read-the-PE-Timestamp-from-a-Windows-Exe https://gi ...

  7. STL set简单用法

    set的常见用法详解 set翻译为集合,是一个内部自动有序并且不含重复元素的容器. 可以用于去掉重复元素,或者元素过大,或者不能散列的情况,set只保留元素本身而不考虑它的个数. 头文件:#inclu ...

  8. Linux永久修改系统时间

    1.date 查看系统时间 2.hwclock --show 查看硬件的时间 3.hwclock --set --date '2017-08-16 17:17:00' 设置硬件时间为17年8月16日1 ...

  9. 个人技术博客Alpha----Android Studio UI学习

    项目联系 这次的项目我在前端组,负责UI,下面简略讲下学到的内容和使用AS过程中遇到的一些问题及其解决方法. 常见UI控件的使用 1.TextView 在TextView中,首先用android:id ...

  10. 17秋 软件工程 Alpha展示博客

    成员简介 姓名 个人简介 博客地址 郑世强 郑世强,计算机三班,了解java web端和Android端编程,使用过Spring MVC和Spring Boot开发商业程序,Android端学习了rx ...