POJ-1845 Sumdiv 逆元,特殊情况
详见代码:
#include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #define MOD 9901 // 9901是一个素数 using namespace std;int A, B; // 计算A^B的所有因子的和 int num[50], ex[50], idx; // 记录所有的因子和指数void deal(int x) {idx = -1;for (int i = 2; i <= (int)sqrt(double (x)); ++i) {if (x % i == 0) {++idx;num[idx] = i;ex[idx] = 0;while (x % i == 0) {++ex[idx];x /= i;}}}if (x != 1) {++idx;num[idx] = x;ex[idx] = 1;} // 分解完成 }/* A * x = 1 mod B; A * x - B * y = 1; 要求1必须是gcd(A, B)的倍数,由于9901是一个素数,因此只有当A==9901是不符合要求的 */int exgcd(int a, int b,int &x, int &y) { if (b == 0) {x = 1, y = 0;return a;}int ret = exgcd(b, a % b, x, y);int t = x;x = y;y = t - a/b*y;return ret; }int getinv(int v) {v %= MOD;int a = v, b = MOD, x, y;exgcd(a, b, x, y);x = (x % MOD + MOD) % MOD;return x; }int _pow(int a, int b) {int ret = 1;a %= MOD;while (b) {if (b & 1) {ret *= a;ret %= MOD;}b >>= 1;a *= a;a %= MOD;}return ret; } // 1073741824 // 等比公式是 (num[i]^exp[i])^B = num[i]^exp[i]*B // 其因子和为num[i]^0 + num[i]^1 + ...num[i]^exp[i]*B // 化简之后就是 (num[i]^(exp[i]*B+1)-1)/(num[i]-1)int main() {int ret;while (scanf("%d %d", &A, &B) == 2) {ret = 1;deal(A); // 对A进行分解for (int i = 0; i <= idx; ++i) {if (num[i] % MOD == 1) { // 这里要进行一下特殊处理,不然就直接去就0的逆元了 ret *= (ex[i]*B+1)%MOD;ret %= MOD;} else {ret *= ((_pow(num[i]%MOD, ex[i]*B+1)-1+MOD)%MOD*getinv(num[i]-1))%MOD;ret %= MOD;}}printf("%d\n", ret);}return 0; }
转载于:https://www.cnblogs.com/Lyush/archive/2013/01/04/2844741.html
POJ-1845 Sumdiv 逆元,特殊情况相关推荐
- 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 ...
- c语言的幂乘积表达式,POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]
大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. ,其中 为素数 2) 约数和 ...
- 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 逆元 / 分治
题意 传送门 POJ 1845 题解 分解质因数 A=p1e1p2e2-pnenA=p_1^{e_1}p_2^{e_2}\dots p_n^{e_n}A=p1e1p2e2-pnen,则约数 ...
- 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)
[POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分 整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...
- POJ 1845 【数论】
题目链接:POJ 1845 题意 求ababa^b的所有约数之和,最终结果对9901求模 需要知识 1.快速幂:二分法求nmnmn^m的结果 2.因数分解:遍历求出所有因数 3.约数和定理:假设n=p ...
最新文章
- [置顶] 当我拿车钥匙的时候,刚交的女朋友跑了。。。
- 微服务项目用了几台服务器,微服务部署运维
- 炎热的夏天过去了,老司机用Python带你爬爬哪个城市最热
- http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html
- 查看SqlServer的内存使用情况
- ReactNative-----环境搭建二(android)
- Hive和HBase
- 2017年10月08日普及组 蜡烛
- 更改API级别的Android Studio
- HDU1234 开门人和关门人(解法二)【废除!!!】
- 如何查看mysql的sql语句索引_mysql 查看sql语句索引情况 详解explain
- Python修改图片分辨率(附代码) | Python工具
- JS计算两个数组的交集、差集、并集、补集(多种实现方式)
- ‘primordial is not defined‘ node 报错解决方法 终极篇!!
- 2017年6月Mac OS 10.11安装文档
- this指向,并改变this指向
- 绘制半长轴和半短轴分别为a,b的椭圆
- 数据库分区概念及简单运用
- 数据库概念mongodb使用数据库CLUD操作
- 蓝牙打开流程(btu_task_start_up打开 和 BT hci打开)