版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/83150667
大意
求 的所有约数之和,答案对9901取模
思路
首先
所以
然后,使用了下面这两个程序进行推导
求等比数列的和程序
#include<cstdio>
using namespace std;int a,b,n,s;
signed main()
{
scanf("%d%d%d",&a,&b,&n);
for(register int i=1;i<=n;i++)
{
printf("%d ",a);
s+=a;
a*=b;
}
printf("\n%d",s);
}
依靠上面这个,推出了
暴力求约数和并求约数程序
#include<cstdio>
#include<algorithm>
using namespace std;int n,s,a[10001],len;
signed main()
{
scanf("%d",&n);
for(register int i=1;i*i<=n;i++)
if(n%i==0){a[++len]=i;s+=i;if(n/i!=i)s+=n/i,a[++len]=n/i;}
sort(a+1,a+1+len);
printf("%d\n",s);
for(register int i=1;i<=len;i++) printf("%d ",a[i]);
}
靠上面这两个就推出了质数的 次方只能是这个质数的 到 次方的和,也就是一个等比数列
根据这个性质,我们把每个数分解成质因数,分别求解并相乘
注意判断没有逆元的情况
代码
#include<cstdio>
#include<algorithm>
#define ymw 9901
using namespace std;long long A,B,x,p[1000001],c[1000001],lenp,ans=1;
inline long long ksm(long long x,long long y)
{
x%=ymw;long long ans=1;
for(;y;x*=x,x%=ymw,y>>=1) if(y&1) ans*=x,ans%=ymw;
return ans%ymw;
}
inline long long db(long long bi,long long len){return ((ksm(bi,len)-1+ymw)%ymw*ksm(bi-1,ymw-2)%ymw)%ymw;}
signed main()
{
scanf("%lld",&A);scanf("%lld",&B);x=A;
for(register int i=2;(long long)i*i<=x;i++)
if(x%i==0)
{
p[++lenp]=i;
while(x%i==0) c[lenp]++,x/=i;
}
if(x!=1) p[++lenp]=x,c[lenp]=1;
for(register int i=1;i<=lenp;i++) c[i]=c[i]*B+1;
for(register int i=1;i<=lenp;i++) if((p[i]-1)%ymw==0)ans=ans*c[i]%ymw;else
(ans*=db(p[i],c[i])%ymw)%=ymw;
printf("%lld",ans);
}