2018年10月17日提高組 T1 春思(待完成)
阿新 • • 發佈:2018-12-16
大意
求的所有約數之和
思路
首先 所以 然後,使用了下面這兩個程式進行推導
求等比數列的和程式
#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]);
}
靠上面這兩個就推出了質數的次方只能是這個質數的到次方的和,也就是一個等比數列
根據這個性質,我們把每個數分解成質因數,分別求解並相乘
60分
#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 start,long long bi,long long len){return start*((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)%ymw;
if(lenp==1) return printf("%lld\n",1+db(A,p[1],c[1]))&0;
//若A只由單個質因子構成,那麼S=1+Sum(A,A^2,A^3……A^B)
for(register int i=1;i<=lenp;i++) (ans*=(1+db(p[i],p[i],c[i])))%=ymw;
//否則,則按照上面的公式分別計算所有質因子的並乘起來
printf("%lld",ans);
}