 /**//*
给出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
搜索
最新评论

|
|