5340. 【NOIP2017模拟9.2A组】春思

题面

题目描述

在这里插入图片描述

输入

两个非负整数A,B

输出

仅一个正整数,表示答案

样例输入

2 3

样例输出

15

数据范围

在这里插入图片描述

提示

在这里插入图片描述

题解

这道题有N个结论

第一:A可分解为 P 1 b 1 P 2 b 2 . . . P n b n P1^{b1}P2^{b2}...Pn^{bn} P1b1P2b2...Pnbn(分解质因数)
第二:首先,第一点是正确的,其次, A B A^B AB可表示为 P 1 b 1 ∗ B P 2 b 2 ∗ B . . . P n b n ∗ B P1^{b1*B}P2^{b2*B}...Pn^{bn*B} P1b1BP2b2B...PnbnB
第三:首先,第二点是正确的,其次,若x的约数和为X,y的约数和为Y,则xy的倍数和为XY
第四:首先,第三点是正确的,其次,若pr为一个质数,易得 p r c pr^c prc的约数和= 1 + p r 1 + p r 2 + . . . + p r c 1+pr^1+pr^2+...+pr^c 1+pr1+pr2+...+prc
第五:这次没有首先了,第四点中的式子是一个等比数列,等比数列的求和公式为:
S n = a 1 ( q n − 1 ) q − 1 ( q ≠ 1 ) S_n=\frac{a_1(q^n-1)}{q-1}(q\neq 1) Sn=q1a1(qn1)(q=1)
其中a1为首项,q为等比数列公比,Sn为等比数列前n项和。

所以就可以很轻松的分解质因数+等比数列求和+乘法逆元/递归求解了!!!

代码

#include<bits/stdc++.h>
using namespace std;
int i,j,k,l,o,num,ny[9905];
long long a[55][2],p;
long long n,m;
void fjzys(long long x)
{
	long long y=1;
	num=0;
	while (y<sqrt(x))
	{
		y++;
		if (x%y==0)
		{
			num++;
			a[num][0]=y;
			while (x%y==0)
			{
				a[num][1]+=p;
				x/=y;
			}
		}
	}
	if (x==1) return;
	if (a[num][0]==x)
	{
		a[num][1]=a[num][1]+p;
	}
	else
	{
		num++;
		a[num][0]=x%9901;
		a[num][1]=p;
	}
}
long long ksm(long long w,long long t)
{
	long long v=1;
	w%=9901;
	while (t!=0)
	{
		if (t%2==1)
		{
			v=(v*w)%9901;
		}
		t>>=1;
		w=(w*w)%9901;
	}
	return v;
}
int main()
{
	freopen("spring.in","r",stdin);
	freopen("spring.out","w",stdout);
	scanf("%lld %lld",&n,&m);
	p=m;
	fjzys(n);
	ny[0]=0;
	for (i=1;i<=9901;i++)
	{
		ny[i]=ksm(i,9899);
	}
	long long ans=1;
	for (i=1;i<=num;i++)
	{
		ans=ans*((ksm(a[i][0],a[i][1]+1)+9900)%9901)%9901*ny[(a[i][0]+9900)%9901]%9901;
	}
	printf("%lld",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值