题意:感觉题意不太好懂,题目并不难,就是给一些p和e,p是素数,e是指数,然后把这个数求出来,设为x,然后让我们逆过程输出x-1的素数拆分形式,形式与输入保持一致。
思路:素数打表以后正常拆分即可。
注意:输入过程需要优化,我以前经常使用字符串模拟的方式,后来发现那种方法比较笨,还是下面的方法简洁;代码如下:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; #define LL long long #define maxn 35000 int prime[maxn],e[maxn]; void make_prime() { memset(prime,1,sizeof(prime)); prime[0] = prime[1] = 0; for(int i = 2; i < maxn; i++) { for(int j = 2*i; j < maxn; j+=i) { prime[j] = 0; } } } int main() { int a,b; char op; LL num = 1; make_prime(); while(~scanf("%d",&a)) { if(a == 0) break; scanf("%d",&b); num = powl(a,b); op = getchar(); if(op == ' ') { while(~scanf("%d%d",&a,&b)) { op = getchar(); //printf("a = %d b = %d op = %c ",a,b,op); num *= powl(a,b); if(op != ' ') break; } } num = num-1; int start,End,flag = 0; memset(e,0,sizeof(e)); for(int i = 2; i <= 32767; i++) { if(num == 1) break; if(prime[i]) { while(num % i == 0) { e[i]++; num /= i; } if(e[i] != 0) { if(!flag) { flag = 1; start = i; } End = i; } } } for(int i = End; i >= start; i--) { if(e[i] != 0) { if(i!=start) printf("%d %d ",i,e[i]); else printf("%d %d ",i,e[i]); } } } return 0; }