题意给一个数a的质数基表示(如84 = (2^2) * (3^1) * (7^1) = p(2, 2) * p(3, 1) * p(7, 1),数据给出的是2 2 3 1 7 1),求a-1的质数基表示形式。
如上述84-1=83,而83 = p(83, 1),则输出83 1
最后以0结束。
反正水,瞎搞就成。代码
#include <cstdio>
#include <cstring>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
const int MAX = 32768;
vector<pair<int, int> > V[MAX];
vector<int> apow[MAX];
int main() {
for (int i = 2; i < MAX; ++i) {
apow[i].push_back(1);
while (*(apow[i].rbegin()) < MAX) {
apow[i].push_back(i * (*(apow[i].rbegin())));
}
}
for (int i = 2; i <= 32767; ++i) {
int m = i;
for (int j = 2; j <= m / j; ++j) {
pair<int, int> P = make_pair(j, 0);
while (m % j == 0) {
++P.second;
m /= j;
}
if (P.second) V[i].push_back(P);
}
if (m > 1) {
V[i].push_back(make_pair(m, 1));
}
}
int a[20], b[20];
while (~scanf(" %d %d", a, b)) {
if (*a == 0) break;
int i = 1;
while ((getchar()) == ' ') {
scanf(" %d %d", a + i, b + i);
++i;
}
int m = 1;
for (int j = 0; j < i; ++j) {
//printf("%d-%d\n", a[j], b[j]);
m *= apow[a[j]][b[j]];
}
--m;
//printf("m = %d\n", m);
for (int i = V[m].size() - 1; i >= 0; --i) {
printf("%d %d", V[m][i].first, V[m][i].second);
if (i) putchar(' ');
}
puts("");
}
return 0;
}