题意:求$A^{B}$的所有约数之和$mod\ 9901$

思路:由结论有,一个数$n$进行质因数分解得到$n={p_{1}}^{c_{1}} * {p_{2}}^{c_{2}} *...* {p_{k}}^{c_{k}}$,那么$n$的约数之和为

$$sum=(1+{p_{1}}^{1}+\cdots+{p_{1}}^{c_{1}})*(1+{p_{2}}^{1}+\cdots +{p_{2}}^{c_{2}})*\cdots*(1+{p_{k}}^{1}+\cdots+{p_{k}}^{c_{k}})$$

所以对$A$质因数分解后,那么$A^{B}$的约数之和

$$sum=(1+{p_{1}}^{1}+\cdots+{p_{1}}^{B*c_{1}})*(1+{p_{2}}^{1}+\cdots +{p_{2}}^{B*c_{2}})*\cdots*(1+{p_{k}}^{1}+\cdots+{p_{k}}^{B*c_{k}})$$

上式中每个括号内都是等比数列,利用分治法对等比数列求和,设$sum(p,c)=1+p+p^2+\cdots+p^{c}$

当$c$为奇数时

$$sum(p,c)=(1+p+\cdots+p^{\frac{c-1}{2}})+(p^{\frac{c+1}{2}}+\cdots+p^c)=(1+p^{\frac{c+1}{2}})*sum(p,\frac{c-1}{2})$$

当$c$为偶数时

$$sum(p,c)=(1+p+\cdots+p^{\frac{c}{2}-1})+(p^{\frac{c}{2}}+p^{\frac{c}{2}+1}\cdots+p^{c-1})+p^c=(1+p^{\frac{c}{2}})*sum(p,\frac{c}{2}-1)+p^c$$

当$c$等于$0$,结束递归, 返回$1$即可

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath> using namespace std; typedef long long ll; const int N = ;
const ll mod = ; ll a, b;
ll p[N], c[N], m; void divide(ll n)
{
m = ;
for (ll i = ; i <= sqrt(n); i++) {
if ( == n % i) {
p[++m] = i, c[m] = ;
while ( == n % i) n /= i, c[m]++;
}
}
if (n > ) p[++m] = n, c[m] = ;
return;
} ll power(ll a, ll b, ll p)
{
ll res = ;
while (b) {
if (b & ) res = (res * a) % p;
a = (a * a) % p, b >>= ;
}
return res % p;
} ll sum(ll p, ll c)
{
if ( == c) return ;
if ( == c % ) {
ll tp1 = ( + power(p, (c + ) / , mod)) % mod;
ll tp2 = sum(p, (c - ) / ) % mod;
return tp1 * tp2 % mod;
}
else {
ll tp1 = ( + power(p, c / , mod)) % mod;
ll tp2 = sum(p, c / - ) % mod;
return (tp1 * tp2 % mod + power(p, c, mod)) % mod;
}
} int main()
{
scanf("%lld%lld", &a, &b);
divide(a);
if ( == a) printf("0\n");
else {
ll res = ;
for (int i = ; i <= m; i++)
res = res * sum(p[i], b * c[i]) % mod;
printf("%lld\n", res);
}
return ;
}

POJ - 1845 Sumdiv(分治)的更多相关文章

  1. poj 1845 POJ 1845 Sumdiv 数学模板

    筛选法+求一个整数的分解+快速模幂运算+递归求计算1+p+p^2+````+p^nPOJ 1845 Sumdiv求A^B的所有约数之和%9901 */#include<stdio.h>#i ...

  2. poj 1845 Sumdiv 约数和定理

    Sumdiv 题目连接: http://poj.org/problem?id=1845 Description Consider two natural numbers A and B. Let S ...

  3. POJ 1845 Sumdiv 【二分 || 逆元】

    任意门:http://poj.org/problem?id=1845. Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions ...

  4. POJ 1845 Sumdiv#质因数分解+二分

    题目链接:http://poj.org/problem?id=1845 关于质因数分解,模板见:http://www.cnblogs.com/atmacmer/p/5285810.html 二分法思想 ...

  5. poj 1845 Sumdiv (等比求和+逆元)

    题目链接:http://poj.org/problem?id=1845 题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000 ...

  6. POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

    传送门:http://poj.org/problem?id=1845 大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有 ...

  7. POJ 1845 Sumdiv

    快速幂+等比数列求和.... Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12599 Accepted: 305 ...

  8. POJ 1845 Sumdiv 【逆元】

    题意:求A^B的所有因子之和 很容易知道,先把分解得到,那么得到,那么 的所有因子和的表达式如下 第一种做法是分治求等比数列的和  用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n: ...

  9. POJ 1845 Sumdiv(逆元)

    题目链接:Sumdiv 题意:给定两个自然数A,B,定义S为A^B所有的自然因子的和,求出S mod 9901的值. 题解:了解下以下知识点   1.整数的唯一分解定理 任意正整数都有且只有唯一的方式 ...

随机推荐

  1. socks5代理服务器搭建

    1.首先,编译安装SS5需要先安装一些依赖组件 yum -y install gcc gcc-c++ automake make pam-devel openldap-devel cyrus-sasl ...

  2. C++-怎样写程序(面向对象)

    使用编程语言写好程序是有技巧的. 主要编程技术: 1. 编程风格 2. 算法 3. 数据结构 4. 设计模式 5. 开发方法 编程风格指的是编程的细节,比如变量名的选择方法.函数的写法等. 算法是解决 ...

  3. 随缘记录 LeetCode第168场周赛 2019-12-22

    5292. 划分数组为连续数字的集合 给你一个整数数组 nums 和一个正整数 k,请你判断是否可以把这个数组划分成一些由 k 个连续数字组成的集合. 如果可以,请返回 True:否则,返回 Fals ...

  4. CentOS7下使用C/C++连接MariaDB/MySQL

    前言 连接数据库通常在Java中使用比较多,但是C/C++在Linux下操作数据库也是比较重要的,很多时候都能用得到,在网上查了很多教程,大多写的有些问题,通过自己摸索,终于成功的连接了MariaDB ...

  5. WPF页面切换

    XAML <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft. ...

  6. Java-POJ1010-STAMP

    说良心话,题目不难,但是题目真的很不好懂,解读一下吧 题意: 读入分两行,第一行为邮票面额(面额相同也视为种类不同)以0结束,第二行为顾客要求的面额,以0结束 要求:每个顾客最多拿4张邮票,并求最优解 ...

  7. Educational Codeforces Round 76 (Rated for Div. 2) C. Dominated Subarray

    Let's call an array tt dominated by value vv in the next situation. At first, array tt should have a ...

  8. 【Html】Html基本标记

    <!doctype html> <html> <head> <!--mata 元信息标记--> <meta charset="utf-8 ...

  9. .NET知识梳理——2.反射

    1. 反射 1.1        DLL-IL-Metadata-反射 DLL:程序集,包含IL 和Metadada IL:面向对象中间语言(不太好阅读) Metadata描述了dll.exe中的各种 ...

  10. HTML连载60-水平居中与设计一个团购界面

    一.水平居中 1.margin:0 auto在绝对定位中就失效了 2.如何让绝对定位的元素水平居中? 只需要设置绝对定位元素的left:50%:然后再设置绝对定位元素的margin-left:-元素宽 ...