【JZOJ5340】春思【数论,数学】

题目大意:

题目链接:https://jzoj.net/senior/#main/show/5340
题目图片:
http://wx2.sinaimg.cn/mw690/0060lm7Tly1fwepmh2hffj30jp0cwac2.jpg
http://wx4.sinaimg.cn/mw690/0060lm7Tly1fwepmh2vacj30jq0e8mxt.jpg
NMN^M的因子和。


思路:

首先把NN分解质因数,那么可以得到
N=d[1]k[1]×d[2]k[2]×...×d[sum]k[sum]N=d[1]^{k[1]} imes d[2]^{k[2]} imes ... imes d[sum]^{k[sum]}
然后可以得到
NM=d[1]k[1]×M×d[2]k[2]×M×...×d[sum]k[sum]×MN^M=d[1]^{k[1] imes M} imes d[2]^{k[2] imes M} imes ... imes d[sum]^{k[sum] imes M}
之后就打表(别怪我蒟蒻太菜)

NN MM 1 2 3 4 5
2 3 7 15 31 63
3 4 13 40 121 364
4 7 31 127 511 2047
5 6 31 156 781 3906
6 12 91 600 3751 22932

可以发现,对于NN是质数,有ans(N,M)=Nm+Nm1+Nm2+...+N1+1ans(N,M)=N^m+N^{m-1}+N^{m-2}+...+N^1+1
对于NN是合数,有ans(N,M)=ans(d[x],k[x]×M)×ans(d[y],k[y]×M)...ans(N,M)=ans(d[x],k[x] imes M) imes ans(d[y],k[y] imes M)...
然后加上一个逆元即可。


代码:

#include <cstdio>
#include <iostream>
#define N 500
#define MOD 9901
#define ll long long
using namespace std;

int sum;
ll n,m,d[N],k[N];

ll ksm(ll x,ll y)
{
	ll ans=1;
	x%=MOD;
	while (y)
	{
		if (y&1) ans=(ans*x)%MOD;
		y>>=1;
		x=(x*x)%MOD;
	}
	return ans;
}

ll S(ll x,ll y)
{
	ll ans=1;
	if (!((x-1)%MOD))
	  return y+1;
	ll inx=ksm(x-1,MOD-2);
	ll k=(ksm(x,y+1)+MOD-1)%MOD;
	ans=k*inx%MOD;
	return ans;
}

int main()
{
	cin>>n>>m;
	for (ll i=2;i*i<=n;i++)  //分解质因数
	 while (!(n%i))
	 {
	 	if (d[sum]!=i) d[++sum]=i;
	 	k[sum]++;
	 	n/=i;
	 }
	if (n>1)
	{
		d[++sum]=n;
		k[sum]++;
	}
	ll ans=1;
	for (int i=1;i<=sum;i++)
	 ans=ans*S(d[i],k[i]*m)%MOD;
	cout<<ans%MOD<<"
";
	return 0;
}
原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998506.html