poj1845 (数论+二分快速取模)
2010-07-05 09:21
218 查看
题意:求A^B的值的所有因子的和模9901,例如2^3=8 => 1+2+4+8=15。最后答案为15%9901 = 15。
分析:先将A^B分解成素因数形式:A^B = (P1^k1) + (P2^k2) + (P3^k3) + ...
那么A^B所有因子之和就是:S = (1 + P1^1 + P1^2 + P1^3 +...+ P1^K) * (1 + P2^1 + P2^2 + P2^3+...+P2^K) * (1 + P3^1 + P3^2 + P3^3 +...+ P3^K) * (...
计算 1 + P + P^2 + P^3 +...+ P ^K 可用二分求解;
当k是偶数时:例如k=4,1 + P + P^2 + P^3 + P^4 = (1+P) + P^2 * (1+P*(1+P));
当k是奇数时:例如k=5,1 + P + P^2 + P^3 + P^4 + P^5 = (1 + P + P^2) + P^3 * (1 + P + P^2);
分析:先将A^B分解成素因数形式:A^B = (P1^k1) + (P2^k2) + (P3^k3) + ...
那么A^B所有因子之和就是:S = (1 + P1^1 + P1^2 + P1^3 +...+ P1^K) * (1 + P2^1 + P2^2 + P2^3+...+P2^K) * (1 + P3^1 + P3^2 + P3^3 +...+ P3^K) * (...
计算 1 + P + P^2 + P^3 +...+ P ^K 可用二分求解;
当k是偶数时:例如k=4,1 + P + P^2 + P^3 + P^4 = (1+P) + P^2 * (1+P*(1+P));
当k是奇数时:例如k=5,1 + P + P^2 + P^3 + P^4 + P^5 = (1 + P + P^2) + P^3 * (1 + P + P^2);
#include<iostream> #include<cmath> using namespace std; const int maxn = 10000; int A,B; int mod = 9901; __int64 pow(__int64 x,__int64 n)//求p^n { __int64 ret=1, s = x; while(1) { if(n & 1) ret = ((ret % mod) * (s % mod)) % mod; if(n >>= 1) s = ((s % mod) * (s % mod)) % mod; else break; } return ret; } __int64 sum(__int64 p, __int64 n)//求1 + p + p^2 +...+ p^n; { if(n==0) return 1; if(n & 1) //n % 2 == 0; return (((1 + pow(p,n/2+1)) % mod) * (sum(p,n/2) % mod)) % mod; else return (((1 + pow(p,n/2+1)) % mod) * (sum(p,(n-1)/2) % mod) + pow(p,n/2) % mod) % mod; } int main() { __int64 s, ans; int i, p[maxn], c[maxn]; //p[i]表示第i个素因子,c[i]表示它的个数。 while(scanf("%d%d",&A,&B)!= EOF) { memset(p, 0, sizeof(p)); memset(c, 0, sizeof(c)); //a^b=p1^(c1*b) * .... * pi^(ci*b) //ans=(1+p1+p1^2+...+p1^(c1*b))*()...*(1+pi+pi^2+...+pi^(ci*b)) //把A分解素数 for(i=2; i*i<=A; i++)//求所有A的素因子存在p[]中, { if(A % i ==0) { p[++p[0]] = i; while( A % i == 0) { A /= i; ++c[p[0]]; //对应的素因子的个数。 } } } if( A != 1) //处理最后一个数。 { p[++p[0]] = A; c[p[0]] = 1; } ans = 1; for(i=1; i<=p[0]; i++)//sum=(p1^(n1*B+1)–1)/(p1-1)*(p2^(n2*B+1)–1)/(p2–2)*… { ans = ((ans % mod) * (sum(p[i], c[i]*B)) % mod) % mod; } printf("%I64d/n",ans); } return 0; }
相关文章推荐
- Sumdiv(数论综合模板题:快速分解因式+快速幂取模+约数和公式+递归二分求等比数列和)
- 数论 快速矩阵幂 POJ 3233 Matrix Power Series 二分和
- poj 1845 Sumdiv(数论:欧拉函数+二分求等比数列前n项和+快速幂取模)
- 数论:二分快速取余
- (POJ1845)Sumdiv <约数和定理 + 快速幂求模 + 二分求等比数列和的模>
- 数论 day3 crt lucas 十进制快速幂
- hdu 3003 pupu ( (题目易混淆概念、详解) 二分快速幂 )
- POJ 3233 Matrix Power Series(矩阵快速幂+二分求解)
- poj 3613 floyd+二分矩阵相乘(快速幂)
- Java实现的两种常见简单查找算法示例【快速查找与二分查找】
- Java冒泡,快速,插入,选择排序^_^+二分算法查找
- 【HDU 1588】Gauss Fibonacci(矩阵快速幂+二分)
- POJ3233---Matrix Power Series(矩阵快速幂+二分)
- hd 3609数论 快速幂 欧拉函数 迭代 递归
- 数论常用内容——矩阵快速幂
- 数论 - 快速幂运算 --- (快速幂+素数判断、水题)
- HDU --- 5446 Unknown Treasure 数论综合【Lucas定理 + 中国剩余定理 + 快速乘 + 思维】
- HDU4549M-斐波那契数列(矩阵快速幂,二分幂)
- bzoj3992: [SDOI2015]序列统计 快速数论变换NTT+矩阵优化
- 给大家分享下:快速排序、冒泡排序、二分查找