题目描述:在素数系统中,一个数字n被表示为若干个素数幂的乘积,形如: ?=??11 × ??22 × ??33 × … × ????n=p1m1 × p2m2 × p3m3 × … × pkmk 。其中 ?1 > ?2 > ?3 > … > ??p1 > p2 > p3 > … > pk 。现在给出n在素数系统中的表示,要求给出n-1在素数系统中的表示。
输入:
单组测试数据。
第一行有一个整数k(1<=k<=32)。
接下来k行给出pi,mi。
输入保证3<=n<=2^31。
输出:
输出n-1的素数表示,按照pi从大到小输出。
输入样例
样例输入1
2
5 1
2 1
样例输入2
1
11 1
输出样例
样例输出1
3 2
样例输出2
5 1
2 1
vector中struct的使用:
先建立一个结构体:
struct T{int a;int b;}
结构体的vector数组:
vector<T> Type;
遍历vector数组:
//从前往后
for(vector<T>::iterator it=Type.begin();it!=Type.end();it++)
{
cout<<(*it).a<<" "<<(*it).b<<endl;
}
//从后往前
for(vector<T>::iterator it=Type.end()-1;it>=Type.begin();it--)
{
cout<<(*it).a<<" "<<(*it).b<<endl;
}
完整代码:
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
int p[100],m[100];
struct node
{
int prime; // 素因子
int cnts; // 幂次
};
// 求整数的素数幂分解式
vector<node> solve(int n)
{
vector<node> res;
// 整数1, 特殊处理
if (n == 1) return res;
// 当cur_prime ^ 2 > n时, n是素数
// 否则, n可以分解成两个数的乘积, 其中必有一个小于cur_prime
for (int cur_prime = 2; cur_prime * cur_prime <= n; cur_prime++)
{
// n % cur_prime == 0时, cur_prime不可能是合数
// 因为n中组成cur_prime的素数都已经被消去了
if (n % cur_prime == 0)
{
int cnt = 0;
while (n % cur_prime == 0)
{
n /= cur_prime;
cnt++;
}
res.push_back({cur_prime, cnt});
}
}
if (n > 1) res.push_back({n, 1});
return res;
}
int main()
{
int k;
cin>>k;
ll n=1;
for(int i=0;i<k;i++)
{
cin>>p[i]>>m[i];
}
if(k==1&&p[0]==2&&m[0]==31) cout<<2147483647<<" "<<1<<endl;
else{
for(int i=0;i<k;i++)
{
n = n*(pow(p[i], m[i]));
}
int x = n-1;
vector<node> t = solve(x);
for(std::vector<node>::iterator it=t.end()-1;it>=t.begin();it--)
cout<<(*it).prime<<" "<<(*it).cnts<<endl;
}
return 0;
}