//============================================================================
// Name : 1091.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <vector>
#include <cmath>
#include <sstream>
using namespace std;
#define MAX_N 15
#define MAX_M 100000000
#define X 10000000000
typedef long long Long;
string zero("0");
void integerToString(Long i, string& str) {
std::stringstream out;
out << i;
str = out.str();
while (str.length() < 10) {
str = zero + str;
}
}
class Number {
private:
vector<Long> data;
public:
Number(int a, int b) {
data.push_back(a);
for (int i = 1; i < b; i++) {
Long mod = 0;
for (int j = 0; j < data.size(); j++) {
Long mul = data[j] * a;
data[j] = mul % X + mod;
mod = mul / X;
}
if (mod > 0) {
data.push_back(mod);
}
}
}
void print() {
string str;
int i;
for (i = data.size() - 1; i >= 0; i--) {
if (data[i] > 0) {
cout << data[i];
break;
}
}
for (int j = i - 1; j >= 0; j--) {
integerToString(data[j], str);
cout << str;
}
cout << endl;
}
void minus(Number& other) {
int last = 0;
for (int i = 0; i < other.data.size(); i++) {
data[i] = data[i] - other.data[i] - last;
if (data[i] < 0) {
data[i] += X;
last = 1;
} else {
last = 0;
}
}
for (int i = other.data.size(); i < data.size() && last; i++) {
data[i] -= last;
if (data[i] < 0) {
data[i] += X;
last = 1;
} else {
last = 0;
}
}
}
void plus(Number& other) {
int last = 0;
for (int i = 0; i < other.data.size(); i++) {
data[i] = data[i] + other.data[i] + last;
if (data[i] >= X) {
data[i] -= X;
last = 1;
} else {
last = 0;
}
}
for (int i = other.data.size(); i < data.size() && last; i++) {
data[i] += last;
if (data[i] >= X) {
data[i] -= X;
last = 1;
} else {
last = 0;
}
}
}
};
class ToPerimes {
private:
vector<int> perimes;
vector<int> counts;
int number;
void calculate(int n, int m, int mul, vector<int>& re) {
if (m == 1) {
for (int i = 0; i < n; i++) {
re.push_back(number / (mul * perimes[i]));
}
} else if (m == n) {
for (int i = 0; i < m; i++) {
mul *= perimes[i];
}
re.push_back(number / mul);
} else {
calculate(n - 1, m, mul, re);
calculate(n - 1, m - 1, mul * perimes[n - 1], re);
}
}
public:
ToPerimes(int i) {
number = i;
int count = 0;
if (i % 2 == 0) {
while (i % 2 == 0) {
i = i / 2;
count++;
}
perimes.push_back(2);
counts.push_back(count);
}
while (i > 1) {
for (int k = 3; k <= i; k += 2) {
if (i % k == 0) {
count = 0;
while (i % k == 0) {
i = i / k;
count++;
}
perimes.push_back(k);
counts.push_back(count);
}
}
}
}
void calculate(int i, vector<int>& re) {
calculate(perimes.size(), i, 1, re);
}
void print() {
for (int i = 0; i < counts.size(); i++) {
cout << perimes[i] << "(" << counts[i] << ")" << " ";
}
cout << endl;
}
int getSize() {
return counts.size();
}
};
void pt(vector<int>& v) {
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
}
int main() {
int n, m;
cin >> n >> m;
Number num(m, n);
ToPerimes tp(m);
int size = tp.getSize();
vector<int> re[size];
for (int i = 0; i < size; i++) {
tp.calculate(i + 1, re[i]);
if (i % 2 == 0) {
for (int j = 0; j < re[i].size(); j++) {
Number nn(re[i][j], n);
num.minus(nn);
}
} else {
for (int j = 0; j < re[i].size(); j++) {
Number nn(re[i][j], n);
num.plus(nn);
}
}
}
num.print();
return 0;
}
poj1091
最新推荐文章于 2020-11-07 12:05:38 发布