/**//* 给出A,B求A^B内的所有约数之和 mod 9901 约数之和,有公式 (p1^0 + + p1^n1)**(pk^0 + + pk^nk) 用等比数列求和公式 (p^(n+1)-1)/(p-1) 这里有1/(p-1),需要求(p-1)关于mod的逆元 但是, 求逆元是有条件的 ax = 1 mod m 存在逆元a^-1 需要 gcd(a,m) = 1
如果不满足,可用公式 a/b%m = a%(bm)/b 这个公式是没条件的,当然b|a 不过当心bm在ipow那里,最大有bm*bm会溢出 不过这题,刚好对于(p-1)%m==0的那些数据,不会导致溢出 另外一种做法就是二分了 对每个1 +p+..+p^n n为奇数 : (1++p^n/2) + p^(n/2+1)(1++p^n/2) n为偶数 : (1++p^n/2) + p^n/2(p++p^n/2) 注意维护p */ #include<iostream> #include<cstring> #include<map> #include<algorithm> #include<stack> #include<queue> #include<cmath> #include<string> #include<cstdlib> #include<vector> #include<cstdio> #include<set> #include<list> #include<numeric> #include<cassert> #include<ctime>
using namespace std;
const long long MOD = 9901;
long long ipow(long long a, long long n, long long MOD){ if(n == 0){ return 1; } if(n == 1){ return a % MOD; } long long ans = ipow(a, n/2, MOD); ans = ans * ans % MOD; if(n & 1 ){ ans = ans * a % MOD; } return ans; }
//ax + ny = d long long ExtendEuclid(long long a, long long n, long long &x , long long &y){//ax = b mod n if(n == 0){ x = 1; y = 0; return a; }else{ // nx' + a%ny' //= nx' + (a - a/n*n)y' //= ay' + n(x'-a/ny') //=ax + ny long long _x, _y, d = ExtendEuclid(n, a % n, _x, _y); x = _y; y = _x - a/n*_y; return d; } }
long long inv(long long a , long long n){//普通逆元求法 ax+ny = 1 long long x,y; ExtendEuclid(a,n,x,y); return x % n; }
long long inv2(long long a, long long n){//x关于素数p的逆元为 x^(p-2) mod p 注意 gcd(x,p) = 1!!! return ipow(a,n-2,n); }
long long solve(long long p , long long n){//p^0 + + p^n long long mod = MOD; //ax = 1 mod m 。a有逆元的条件是gcd(a,n) = 1 !!!! 否则无解,不能用ExtendEuclid //a/b%m = a%(bm)/b 这道题刚好mod = bm,在上面做乘法时不会溢出 if((p-1) % mod == 0){ mod *= p-1; return (ipow(p,n+1,mod)-1) / (p-1); }else{ //虽然公式a/b%m = a%(bm)/b 在这里也可以用的,但是某些数据,导致ipow那里溢出 //用逆元就没事 return (ipow(p,n+1, MOD)-1) * inv(p-1, MOD) % MOD; } }
long long cal(long long a, long long n, long long &p){//a^0+..+a^n , p = a^n if(n == 0){ p = 1; return 1; } if(n == 1){ p = a % MOD; return (1 + a) % MOD; } long long ans = cal(a, n/2, p); //注意别忘记维护p了 if(n&1){ ans = ans * (1 + p*a) % MOD; p = p * p * a % MOD; return ans; }else { ans = (ans + (ans- 1) * p % MOD) % MOD; p = p * p % MOD; return ans; } }
int main() { #ifndef ONLINE_JUDGE //freopen("in","r",stdin); #endif
for(long long a , b ; ~scanf("%lld%lld", &a, &b); ){ if(a == 0){ printf("0\n"); continue; } long long ans = 1; for(long long p = 2 ; p*p <= a ; p++){ if(a % p == 0){ long long cnt = 0; while(a % p == 0){ a /=p; cnt++; } cnt *= b; ans = ans * solve(p ,cnt) % MOD; } } if(a > 1){ ans = ans * solve(a, b) % MOD; } printf("%lld\n", (ans+MOD)%MOD); } return 0; }
|
|
常用链接
随笔分类
Links
搜索
最新评论
|
|