2018年10月18日提高组 T1 春思

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/83150667

大意

A B A^B 的所有约数之和,答案对9901取模


思路

首先 A = p 1 c 1 p 2 c 2 p 3 c 3 p 4 c 4 A=p_1^{c_1}p_2^{c_2}p_3^{c_3}p_4^{c_4}……
所以 A B = ( p 1 c 1 p 2 c 2 p 3 c 3 p 4 c 4 ) B A^B=(p_1^{c_1}p_2^{c_2}p_3^{c_3}p_4^{c_4}……)^B
= p 1 c 1 × B p 2 c 2 × B p 3 c 3 × B p 4 c 4 × 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 + a b + a b 2 + a b 3 + a b n = a × b n 1 b 1 a+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]);
}

靠上面这两个就推出了质数的 n n 次方只能是这个质数的 1 1 n n 次方的和,也就是一个等比数列

根据这个性质,我们把每个数分解成质因数,分别求解并相乘

注意判断没有逆元的情况


代码

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

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/83150667