1. 程式人生 > >2018年10月17日提高組 T1 春思(待完成)

2018年10月17日提高組 T1 春思(待完成)

大意

ABA^B的所有約數之和

思路

首先A=p1c1p2c2p3c3p4c4A=p_1^{c_1}p_2^{c_2}p_3^{c_3}p_4^{c_4}…… 所以AB=(p1c1p2c2p3c3p4c4)BA^B=(p_1^{c_1}p_2^{c_2}p_3^{c_3}p_4^{c_4}……)^B =p1c1×Bp2c2×Bp3c3×Bp4c4×B=p_1^{c_1\times B}p_2^{c_2\times B}p_3^{c_3\times B}p_4^{c_4\times B}……

然後,使用了下面這兩個程式進行推導

求等比數列的和程式

#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);
}

依靠上面這個,推出了a+ab+ab2+ab3+ab

n=a×bn1b1a+ab+ab^2+ab^3……+ab^n=a\times \frac{b^n-1}{b-1}

暴力求約數和並求約數程式

#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]); }

靠上面這兩個就推出了質數的nn次方只能是這個質數的11nn次方的和,也就是一個等比數列

根據這個性質,我們把每個數分解成質因數,分別求解並相乘

\geq 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);
}