POJ 1845 逆元 / 分治
题意
传送门 POJ 1845
题解
分解质因数 A=p1e1p2e2…pnenA=p_1^{e_1}p_2^{e_2}\dots p_n^{e_n}A=p1e1p2e2…pnen,则约数和为
(1+p1+⋯+p1e1)(1+p2+⋯+p2e2)…(1+pn+⋯+pnen)(1+p_1+\dots +p_1^{e_1})(1+p_2+\dots +p_2^{e_2})\dots (1+p_n+\dots +p_n^{e_n})(1+p1+⋯+p1e1)(1+p2+⋯+p2e2)…(1+pn+⋯+pnen)
逆元
对于质因数 pip_ipi,根据等比数列求和公式,括号内求和为 pieiB+1−1pi−1\frac{p_i^{e_iB+1}-1}{p_i-1}pi−1pieiB+1−1 分子项快速幂求解,分母项逆元求解。对于 pimodm=1p_i\ mod\ m =1pi mod m=1 的情况需要特殊处理,因为此时 pi−1p_i-1pi−1 不存在逆元。对于正整数 NNN,至多有一个大于等于 N\sqrt NN 的质因子,那么逆元打表处理 [1,N][1,\sqrt N][1,N] 的部分,对于超出这个范围的部分,利用费马小定理进行快速幂求逆元。
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
#define mod 9901
typedef map<int, int> mp;
int A, B, inv[mod];mp prime_factor(int n)
{mp res;for (int i = 2; i * i <= n; ++i){while (n % i == 0){++res[i];n /= i;}}if (n != 1)res[n] = 1;return res;
}int mod_pow(int x, int n)
{int res = 1;x %= mod;while (n){if (n & 1)res = res * x % mod;x = x * x % mod;n >>= 1;}return res;
}int get_inv(int n)
{if (n < mod)return inv[n];return mod_pow(n, mod - 2);
}int main()
{inv[1] = 1;for (int i = 2; i < mod; ++i)inv[i] = (mod - mod / i) * inv[mod % i] % mod;scanf("%d%d", &A, &B);mp fac = prime_factor(A);int res = 1;for (mp::iterator it = fac.begin(); it != fac.end(); ++it){int p = it->first, e = it->second * B;if (p % mod != 1)res = res * (mod_pow(p, e + 1) + mod - 1) % mod * get_inv(p - 1) % mod;elseres = res * (e % mod + 1) % mod;}printf("%d\n", res);return 0;
}
分治
考虑质因数 pip_ipi,若 eie_iei 为奇数,设其括号内求和为 sum(p,e)sum(p,e)sum(p,e),则有
sum(p,e)=(1+p+⋯+p⌊e/2⌋)+(p⌊e/2⌋+1+⋯+pe)=(1+p⌊e/2⌋+1)×sum(p,⌊e/2⌋)sum(p,e)=(1+p+\dots+p^{\lfloor e/2\rfloor})+(p^{\lfloor e/2\rfloor+1}+\dots +p^e)=(1+p^{\lfloor e/2\rfloor+1})\times sum(p,\lfloor e/2\rfloor)sum(p,e)=(1+p+⋯+p⌊e/2⌋)+(p⌊e/2⌋+1+⋯+pe)=(1+p⌊e/2⌋+1)×sum(p,⌊e/2⌋) 指数为偶数,将 pieip_i^{e_i}piei 加入答案后将 eie_iei 减一处理为奇数情况即可。
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
#define mod 9901
typedef map<int, int> mp;
int A, B;mp prime_factor(int n)
{mp res;for (int i = 2; i * i <= n; ++i){while (n % i == 0){++res[i];n /= i;}}if (n != 1)res[n] = 1;return res;
}int mod_pow(int x, int n)
{int res = 1;x %= mod;while (n){if (n & 1)res = res * x % mod;x = x * x % mod;n >>= 1;}return res;
}int sum(int p, int e)
{if (!e)return 1;int res = 0;if (!(e & 1))res += mod_pow(p, e), --e;e /= 2, res += (1 + mod_pow(p, e + 1)) * sum(p, e);return res % mod;
}int main()
{scanf("%d%d", &A, &B);mp fac = prime_factor(A);int res = 1;for (mp::iterator it = fac.begin(); it != fac.end(); ++it){int p = it->first, e = it->second * B;res = res * sum(p, e) % mod;}printf("%d\n", res);return 0;
}
POJ 1845 逆元 / 分治相关推荐
- Linux等比数列脚本求和,POJ 1845 (约数和+二分等比数列求和)
题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式.其中Pn ...
- Sumdiv POJ - 1845
Sumdiv POJ - 1845 题意: 求ABA^BAB的所有约数之和mod 9901(1<=A,B<=5e7) 题解: 我们先将A分解质因子,表示为:p1c1∗p2c2∗...... ...
- 【简●解】POJ 1845 【Sumdiv】
POJ 1845 [Sumdiv] [题目大意] 给定\(A\)和\(B\),求\(A^B\)的所有约数之和,对\(9901\)取模. (对于全部数据,\(0<= A <= B <= ...
- 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)
[POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分 整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...
- POJ 1845 【数论】
题目链接:POJ 1845 题意 求ababa^b的所有约数之和,最终结果对9901求模 需要知识 1.快速幂:二分法求nmnmn^m的结果 2.因数分解:遍历求出所有因数 3.约数和定理:假设n=p ...
- POJ 1845 Sumdiv 【逆元】
题意:求A^B的所有因子之和 很容易知道,先把分解得到,那么得到,那么 的所有因子和的表达式如下 第一种做法是分治求等比数列的和 用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n: ...
- poj 1845 Sumdiv (算数基本定理+逆元)
输入a和b,求a^b的所有因子之和. #include <iostream> #define ll long longusing namespace std;const int mod=9 ...
- POJ 1741 树分治
题目链接[http://poj.org/problem?id=1741] 题意: 给出一颗树,然后寻找点对(u,v)&&dis[u][v] < k的对数. 题解: 这是一个很经典 ...
- 礼物(中国剩余定理+拓展gcd求逆元+分治=拓展Lucus)
礼物 题意: 求\[C(n,m)\ \%\ p\] \(n,m,p\le 10^9\),且若\(p=\prod_{i=1}^{k}{p_i}^{c_i}\),则\(\forall i\in [1..k ...
最新文章
- Java:封装的概念,UML类图,构造方法,this关键字,static关键字,方法重载,包package
- 二:unittest框架配合selenium之xpath定位
- cucumber测试_如何在Cucumber中进行后端测试
- 马斯克称面临巨大通胀压力 暗示特斯拉可能涨价
- ThreadLocal到底是什么,尚硅谷docker高级
- 数据库系统概论第五版(第 5 章 数据库完整性)笔记
- 计算机基础知识100题 含答案,计算机基础知识练习试题及答案
- Ubuntu20.04下搜狗输入法安装配置(超精简)
- 交换机接出来的网线可以再接上无线路由器实现无线上网吗
- 在线社交网络的影响力最大化算法
- 实时展示摄像头内容(go server + electron-vue client)
- echartsx轴数据过多,倾斜45度
- Android 按电源键亮屏/息屏流程分析
- mac macbook应用清单
- 送您一份《学编程笔记本电脑选购指南》,建议收藏!
- Element UI 应用精讲
- win10 使用多桌面的两种方式
- 开源机器人【01】 - 积木编程软件OpenBlock(类似scratch)
- RestTemplate设置通用header 并获取header请求参数
- μthenticode:一款用于验证 Windows 文件签名的跨平台工具