Sumdiv POJ - 1845

题意:

求ABA^BAB的所有约数之和mod 9901(1<=A,B<=5e7)

题解:

我们先将A分解质因子,表示为:p1c1∗p2c2∗......∗pncnp_{1}^{c_{1}}*p_{2}^{c_{2}}*......*p_{n}^{c_{n}}p1c1​​∗p2c2​​∗......∗pncn​​
约数之和我们是有公式的:
A的约数和是:(1+p1+p12+....+p1c1)∗....∗(1+pn+pn2+....+pncn)(1+p_{1}+p_{1}^2+....+p_{1}^{c_{1}})*....*(1+p_{n}+p_{n}^2+....+p_{n}^{c_{n}})(1+p1​+p12​+....+p1c1​​)∗....∗(1+pn​+pn2​+....+pncn​​)
ABA^BAB的所有约数之和为:
(1+p1+p12+....+p1B∗c1)∗....∗(1+pn+pn2+....+pnB∗cn)(1+p_{1}+p_{1}^2+....+p_{1}^{B*c_{1}})*....*(1+p_{n}+p_{n}^2+....+p_{n}^{B*c_{n}})(1+p1​+p12​+....+p1B∗c1​​)∗....∗(1+pn​+pn2​+....+pnB∗cn​​)
不难发现,每一项都是一个等比序列,我们用等比序列求和,(1+p1+p12+....+p1B∗c1)=(p1B∗c1+1−1)/(p1−1)(1+p_{1}+p_{1}^2+....+p_{1}^{B*c_{1}})=(p_{1}^{B*c_{1}+1}-1)/(p_{1}-1)(1+p1​+p12​+....+p1B∗c1​​)=(p1B∗c1​+1​−1)/(p1​−1)
对于分子分母我们分开求,用快速幂求即可,分母逆元
但是这样并没有结束,什么时候b的逆元是bp−2b^{p-2}bp−2,当p是质数且b与m互质时,本题中9901是质数,但是p1−1p_{1}-1p1​−1有可能是9901的倍数,此时乘法逆元就不存在。这种情况特判,此时(1+p1+p12+....+p1B∗c1)≡1+1+12+...+1B∗c1≡B∗c1+1(mod9901)(1+p_{1}+p_{1}^2+....+p_{1}^{B*c_{1}})\equiv 1+1+1^2+...+1^{B*c_{1}}\equiv B*c_{1}+1(\bmod 9901)(1+p1​+p12​+....+p1B∗c1​​)≡1+1+12+...+1B∗c1​≡B∗c1​+1(mod9901)

代码:

// Problem: Sumdiv
// Contest: Virtual Judge - POJ
// URL: https://vjudge.net/problem/POJ-1845
// Memory Limit: 30 MB
// Time Limit: 1000 ms
// Data:2021-08-26 14:17:14
// By Jozky#include <cmath>
#include <cstdio>
#include <ctime>
#include <iostream>
// #include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{#ifdef LOCALstartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{#ifdef LOCALendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
int a, b, m, ans= 1;
const int mod= 9901;
int p[20], c[20];
void divide(int n)
{m= 0;for (int i= 2; i <= sqrt(n); i++) {if (n % i == 0) {p[++m]= i;c[m]= 0;while (n % i == 0) {n/= i;c[m]++;}}}if (n > 1) {p[++m]= n;c[m]= 1;}
}
ll poww(ll a, ll b)
{ll ans= 1;while (b) {if (b & 1)ans= ans * a % mod;a= a * a % mod;b>>= 1;}return ans;
}
int main()
{//rd_test();cin >> a >> b;divide(a);for (int i= 1; i <= m; i++) {if ((p[i] - 1) % mod == 0) {ans= ((1ll * b * c[i] + 1) % mod) * ans % mod;continue;}int x= poww(p[i], 1ll * b * c[i] + 1); //分子x= (x - 1 + mod) % mod;int y= p[i] - 1; //分母y= poww(y, mod - 2);ans= 1ll * ans * x % mod * y % mod;}cout << ans << endl;//Time_test();
}

Sumdiv POJ - 1845相关推荐

  1. 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)

    [POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分  整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...

  2. 【简●解】POJ 1845 【Sumdiv】

    POJ 1845 [Sumdiv] [题目大意] 给定\(A\)和\(B\),求\(A^B\)的所有约数之和,对\(9901\)取模. (对于全部数据,\(0<= A <= B <= ...

  3. Linux等比数列脚本求和,POJ 1845 (约数和+二分等比数列求和)

    题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式.其中Pn ...

  4. POJ 1845 逆元 / 分治

    题意 传送门 POJ 1845 题解 分解质因数 A=p1e1p2e2-pnenA=p_1^{e_1}p_2^{e_2}\dots p_n^{e_n}A=p1e1​​p2e2​​-pnen​​,则约数 ...

  5. POJ 1845 【数论】

    题目链接:POJ 1845 题意 求ababa^b的所有约数之和,最终结果对9901求模 需要知识 1.快速幂:二分法求nmnmn^m的结果 2.因数分解:遍历求出所有因数 3.约数和定理:假设n=p ...

  6. c语言的幂乘积表达式,POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

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

  7. poj 1845 Sumdiv (算数基本定理+逆元)

    输入a和b,求a^b的所有因子之和. #include <iostream> #define ll long longusing namespace std;const int mod=9 ...

  8. POJ 1845 Sumdiv 【逆元】

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

  9. c语言五个水手分椰子答案,zstu.4014.水手分椰子(数学推导)

    深入浅出学算法015-水手分椰子 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1827  Solved: 524 Description n个水手来到 ...

最新文章

  1. 基于Linux(LAMP)平台搭建MYsql数据库(二)
  2. 嵌入式Linux之我行——ARM MMU工作原理剖析
  3. Java oracle查询语句无法赋值给_java.sql.SQLException: 无法转换为内部表示 -〉java 查询oracle数据库返回错误信息...
  4. 10月15日 2016中国开源年会期待您的参与
  5. 矩阵模拟问题合集(Leetcode题解-Python语言)
  6. jzoj3319-[BOI2013]雪地踪迹【bfs】
  7. winre drv分区干嘛用的_都2020年了,还在给硬盘分区?看完你就知道有没有必要了...
  8. python 多分类情感词典_基于情感词典的文本情感分类
  9. 【翻译自mos文章】使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式。...
  10. 圣诞节美食聚会派对海报设计
  11. CSS3 新增选择器:伪类选择器和属性选择器
  12. android 安卓editext默认弹出英文输入法,只能输入英文与数字
  13. IOS开发自定义tableviewcell的注意点
  14. BP神经网络模型及梯度下降法
  15. 渗透测试实战分享—从app到网站沦陷
  16. 大学英语(第四册)复习(原文及全文翻译)——Unit 5 - TO LIE OR NOT TOLIE—THE DOCTOR‘S DILEMMA(撒谎还是不撒谎——医生的难题)
  17. 杭州好玩景点攻略76
  18. 从JDBC到Mybatis
  19. 我的世界服务器修改视野,我的世界默认视野是多少度
  20. Fighting!Hack for wuhan 黑客马拉松等你来战

热门文章

  1. 除了沉迷酒色之外,你还做过什么?
  2. 首次公开!人教版1-9年级绝密编写:被重点中小学永久收录的数学教案和试题...
  3. 50张图,带你认识大学各专业
  4. 每个人都应该学习编程,因为它会教你如何思考
  5. 毕业的那天,程序员师兄竟然让我去做这一行
  6. 你知道怎么样排序才能做到多快好省?
  7. 中国式创新技术“步态识别”终于来临,你大胆地走两步,我就知道你是谁
  8. 11尺寸长宽 iphone_LED显示屏的尺寸规格计算方法
  9. 学妹问我Java枚举类与注解,我直接用这个搞定她!
  10. ecshop goods.php,重命名ecshop的商品页goods.php为shangpin.php