JOP1845:参考文献,思路写的很清晰
思路:要想求a得b次方得约数,可以先求出来a得约数求和,(质因数),然后在a得指数上面乘上b,就可以求出来了
//POJ1845 因式分解短除法,快速幂取余,等比队列求和递归方法
#include<iostream>
using namespace std;
int const N = 1e6 + 10;
int moudle = 9901;
long long a,b,x, ans=1;
int prime[N], cnt, exponent[N];
bool vis[N];
int quick_power(int a, int b,int p) {//求a的b次时间复杂度logn
long long multiple = 1;//初始化在快速幂函数中防止每次求幂的值累加
while (b) {
//long long multiple = 1;
if (b & 1) {
multiple =(long long ) multiple * a%p;
}
a = a * a %p;
b = b / 2;
}
return multiple;
}
int sum(int q, int m) {//递归求等比数列
if (m == 0) {
return 1;
}
if (m & 1) {//表示m为奇数
return (1 + quick_power(q, (m + 1) / 2,moudle)) * (sum(q, (m - 1) / 2)%moudle);
}
else
return (1 + quick_power(q, m / 2, moudle)) * (sum(q, m / 2-1)%moudle)+quick_power(q,m,moudle);
}
int div(int n) {//分解质因数//效果就是统计n的质因数,以及指数
for (int i = 2; i <= n / i; i++) {
if (n % i == 0) {
cnt++;
prime[cnt] = i;
while (n % i == 0) {
n = n / i;
exponent[cnt]++;
}
}
}
if (n > 1) {
cnt++;
prime[cnt] = n;
exponent[cnt] = 1;
}
for (int i = 1; i <= cnt; i++) {//说明有n个质因数
ans = (long long )ans%moudle * sum(prime[i], exponent[i] * b%moudle)%moudle;
}
cout << "质因数个数:" << cnt << endl;
return ans;
}
int main() {
cin >> a >> b;
cout << div(a);
return 0;
}
答案:
参考思路:
该程序使用快速幂算法和等比数列求和递归方法解决POJ1845问题,首先求出a的约数和(质因数分解),然后乘以b的指数模运算结果,得到a的b次方的约数和。
7437

被折叠的 条评论
为什么被折叠?



