小鬼王琳凱同款VR音遊《樂動未來·音計劃》白嫖指南!
阿新 • • 發佈:2021-09-14
題目大意
給定兩個正整數 \(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