小M的因子和
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
小M在上课时有些得意忘形,老师想出道题目难住他。小M听说是求因子和,还是非常得意,但是看完题目是求A的B次方的因子和,有些手足无措了,你能解决这个问题吗?
-
输入
-
有多组测试样例
每行两个数 A ,B ,(1≤A,B≤10^9)
输出
- 输出A的B次方的因子和,并对9901取余。 样例输入
-
2 3
样例输出
-
15
-
A^B素因子和 将A分解A^B=p1^(k1*B)+p2^(k2*B)+....+pn^(kn*B)
-
#include <iostream> #include <stdio.h> using namespace std; int p[10010],k[10010],num; void syz ( int a )// 分解质因数素因子及其个数 { int i,ans=a; num=0; for(i=2; i*i<=a; i++) { if(ans%i==0) { p[num]=i; k[num]=0; while(ans%i==0) { ans/=i; k[num]++; } num++; } } //cout<<"ans="<<ans<<endl; if(ans!=1) { //cout<<"num="<<num<<endl; p[num]=ans; k[num]=1; num++; } // cout<<"num ="<<num<<endl; // for(i=0;i<num;i++) // cout<<i <<" " << p[i]<<" "<<k[i]<<endl; } int fastpow ( int a,int b)//快速幂 { int p= 9901; int ans=1; a=a%p; while( b ) { if(b&1) ans=ans*a%p; a=a*a%p; b>>=1; } //cout<<"ans="<<ans<<endl; return ans; } int sum_(int a,int n)//等比数列二分(分治)求和 { if(n==0) return 1; if(n&1) return sum_(a,n/2)*(fastpow(a,(n/2+1))+1)%9901; else return (sum_(a,n/2-1)*(fastpow(a,n/2)+1)+fastpow(a,n))%9901; } int main() {//freopen("Input.txt","r",stdin); // freopen("aaa.txt","w",stdout); int A , B ,w[10010] ,i,ans; while( cin >> A >> B) { syz(A); for(i=0; i<num; i++) { k[i]=k[i]*B; // cout<<"k[i]= "<<k[i]<<endl; } for(i=0; i<num; i++) { w[i]=sum_(p[i],k[i]); } ans=1; for(i=0; i<num; i++) ans=(ans*w[i])%9901; cout<<ans<<endl; } return 0; }
-
有多组测试样例