题目链接:http://poj.org/problem?id=1365
题目意思:n= p1^e1* p2^ e2* ……pk^ek
现在给出p1,e1 ,p2,e2……pk,ek。求n-1 的质因子与相对应的幂,质因子从大到小
代码如下:
/*
* File: main.cpp
* Author: ssslpk
*32ms
* Created on August 26, 2012, 6:53 PM
*/
#include <cstdlib>
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
using namespace std;
const int maxn = 100002;
bool ispri[maxn];
int pri[maxn];
int plen;
void prime() {
plen = 0;
memset(ispri, 1, sizeof (ispri));
ispri[0] = ispri[1] = 0;
for (int i = 2; i < maxn; i++)
if (ispri[i]) {
pri[plen++] = i;
for (int j = 2; i * j < maxn; j++)
ispri[i * j] = 0;
}
}
int path[maxn];
int po[maxn];
int cnt;
void slove(int n) {
int cnt = 0;
for (int i = 0; pri[i] <= n && n != 1; i++) {
int ct = 0;
while (n % pri[i] == 0) {
ct++;
n /= pri[i];
}
if (ct != 0) {
path[cnt] = pri[i];
po[cnt++] = ct;
}
}
for (int i = cnt - 1; i >= 0; i--) {
if (i != 0)printf("%d %d ", path[i], po[i]);
else printf("%d %d\n", path[i], po[i]);
}
}
int main() {
prime();
int num, a, b;
char ch;
while (scanf("%d", &a), a) {
scanf("%d%c", &b, &ch);
num = 1;
num *= (int) pow(1.0 * a, 1.0 * b);
while (ch != '\n') {
scanf("%d%d%c", &a, &b, &ch);
num *= pow(a, b);
}
slove(num - 1);
}
return 0;
}