题意:求AB的所有因子(包括1和它本身)的和。
思路:看似简单,实际上暗藏玄机!
很明显,我们可以用O(sqrt(A))的做法,求出A的所有质因子,以及该质因子出现的次数,此时再举个例子,我们发现12可以由2的2次幂和3的一次幂组成,我们现在想求12的所有因子的组成,可以看成(1 + 2 + 22)*(1 + 3)。同理,如果最高次幂到达了B次,我们实际上是给最高次幂乘上一个B,然后做个等比数列求和就可以了。
当然,此题暗藏玄机!
我们可以发现,当等比数列的比q,当q % mod == 1时候,会发现,原式变成了0/0型,但是实际上,这样的答案是有值的,应该为项数之和。
所以,我们特殊处理一下q % mod == 1的时候,就可以了,以后也要注意等比数列的“0 / 0”型!
#include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <limits> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #include <bitset> #define lowbit(x) ( x&(-x) ) #define pi 3.141592653589793 #define e 2.718281828459045 #define INF 0x3f3f3f3f #define HalF (l + r)>>1 #define lsn rt<<1 #define rsn rt<<1|1 #define Lson lsn, l, mid #define Rson rsn, mid+1, r #define QL Lson, ql, qr #define QR Rson, ql, qr #define myself rt, l, r #define pii pair<int, int> #define MP(a, b) make_pair(a, b) using namespace std; typedef unsigned long long ull; typedef unsigned int uit; typedef long long ll; const ll mod = 9901, P = mod - 1; ll qpow(ll a, ll b = mod - 2) { ll ans = 1; while(b) { if(b & 1LL) ans = ans * a % mod; a = a * a % mod; b >>= 1LL; } return ans; } ll A, B; int main() { scanf("%lld%lld", &A, &B); ll ans = 1LL, tim = 0, q; for(int i = 2; 1LL * i * i <= A; i ++) { if(A % i == 0) { tim = 0; while(A % i == 0) { A /= i; tim ++; } q = i % mod; if(q == 1) { ans = ans * (B % mod * tim % mod + 1LL) % mod; } else { ll fz = (qpow(i, (B % P * tim + 1LL) % P) - 1LL + mod) % mod; ll fm = (i - 1LL + mod) % mod; ll tmp = fz * qpow(fm) % mod; ans = ans * tmp % mod; } } } if(A > 1) { q = A % mod; if(q == 1) { ans = ans * (B % mod + 1LL) % mod; } else { ll fz = (qpow(A % mod, (B % P + 1LL) % P) - 1LL + mod) % mod; ll fm = (A - 1LL + mod) % mod; ll tmp = fz * qpow(fm) % mod; ans = ans * tmp % mod; } } printf("%lld\n", ans); return 0; }