1. 程式人生 > 遊戲 >小鬼王琳凱同款VR音遊《樂動未來·音計劃》白嫖指南!

小鬼王琳凱同款VR音遊《樂動未來·音計劃》白嫖指南!

題目大意

給定兩個正整數 \(a\)\(b\),試求出 \(a^b\) 的因子和。

解題思路

本題鑰匙:因子和公式。

現有一數 \(x\)

先將 \(x\) 質因數分解,即 \(x=a_1^{f_1}+a_2^{f_2}+a_3*{f_3}+ \dots + a_n^{f_n}\)

\(x\) 的因子和即為 \(\lim_{k=1}^{n}\sum_{i=1}^{f_k}a_k^{f_i}\)

那麼 \(x^y\) 的質因數分解即是 \(a\) 不變,指數乘上 \(y\)

其實是,一樣的。

考場上陣列開大 MLE 了,慘丟 \(100pts\),啊!。

AC CODE

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int mod = 9901;

int a, b;

int ans = 1;

int k, q[2000005], p[2000005];

int qpow(int x, int y)
{
	int ans = 1ll;
	while(y)
	{
		if(y & 1)
		{
			ans = ans * x % mod;
		}
		x = x * x % mod;
		y /= 2;
	}
	return ans % mod;
}

signed main()
{
	scanf("%lld%lld", &a, &b);
	int kk = a;
	for(register int i = 2; i * i <= a; ++i)
	{
		if(kk % i == 0)
		{
			q[++k] = 1;
			p[k] = i;
			kk /= i;
		}
		while(kk % i == 0)
		{
			q[k]++;
			kk /= i;
		}
	}
	if(kk != 1)
	{
		p[++k] = kk;
		q[k] = 1;
	}
	for(int i = 1; i <= k; ++i)
		q[i] *= b;
	for(register int i = 1; i <= k; ++i)
	{
		int x = 1ll * (qpow(p[i], q[i] + 1) - 1) * qpow(p[i] - 1, mod - 2) % mod;
		ans = ans * x % mod;
	}
	printf("%lld\n", ans % mod);
	return 0;
}

本文來自部落格園,作者:蒟蒻orz,轉載請註明原文連結:https://www.cnblogs.com/orzz/p/15368497.html