题目分析:题目大致意思是给你a,b,然后s定义为所有a^b的因子的和,把 s 01 的值输出  poj 1845 s mdiv 积性函数 数论 欧几里得 输入n m求出n^m的因子之和(mod9901) 比如: 2^3 = 8. the nat ral divisors of 8 are: 1,2,4,8. their s m is 15. 15 mod lo 9901 is 15 (that sho ld be o tp t). 由于n m数据极大(0 = a,b = )故直接算是不可能的 因为把n分解质因数可以得到:a=p1^e1 * p2^e2 .....pn^en; 于是a^b 则可以写为:c = p1^(e1*b) * p2^(e2*b) .....pn^(en*b); 于是c的因子的和: (p1^0+p1^1+p1^2....p1^(e1*b)) * (p2^0+p2^1+p2^2....p2^(e2*b))...(pn^0+pn^1+pn^2....pn^(en*b)); 又因为根据等比数列的和s=a1*(1-q^n)(1-q)可以得到: (p1^(e1*b)-1)(p1-1) * (p2^(e2*b)-1)(p2-1) * .... * (pn^(en*b)-1)(pn-1) 求p1^(e1*b)可以采用二分加速 注意要检验(pi-1)%m时候等于0的情况 #incl de "iostream" #incl de "iostream" #incl de "cstring" #incl de "cmath" #incl de "cstdio" sing namespace std; #define lld long long const int n = ; const int m = 9901; lld p[m], e[m];p质因数 e个数 int plist[n], pco nt = 0; int n, m; lld mod; int prime(int n) { int i; if ((n != 2 && !(n % 2)) || (n != 3 && !(n % 3)) || (n != 5 && !(n % 5)) || (n != 7 && !(n % 7 ret rn 0; for (i = 0; plist[i] * plist[i] = n; i) if (!(n % plist[i])) ret rn 0; ret rn n  1; } void initprime { int i; for (plist[pco nt] = 2, i = 3; i  ; i) if (prime(i)) plist[pco nt] = i; } int prime_factor(int n, lld *f, lld *nf) { 分解质因数 int cnt = 0; int n2 = (int) sqrt((do ble) n); for (int i = 0; n  1 && plist[i] = n2; i) if (n % plist[i] == 0) { for (nf[cnt] = 0; n % plist[i] == 0; nf[cnt], n = plist[i]); f[cnt] = plist[i]; } if (n  1) nf[cnt] = 1, f[cnt] = n; ret rn cnt; } lld m l(lld a, lld k, lld m) { lld ret = 0, tmp = a % m; while(k) { if(k & 1) if((ret += tmp) = m) ret -= m; if((tmp = 1) = m) tmp -= m; k = 1; } ret rn ret; } lld power(lld a, lld k, lld m) {求 a ^k % m lld res = 1; while (k) { if (k & 1) res = m l(res, a, m); a = m l(a, a, m); k = 1; } ret rn res; } void e clidgcd(lld a, lld b, lld &d, lld &x, lld &y) { if (!b) { d = a; x = 1; y = 0; } else { e clidgcd(b, a % b, d, y, x); y -= (a  b) * x;