关于题意举例说明吧
例如 509 1 59 1
x = 509^1 * 59^1 = 30031
x-1 = 30030
则答案 13 1 11 1 7 1 5 1 3 1 2 1 就是 x-1 = 13^1 * 11^1 * 7^1 * 5^1 *3^1 *2^1
= 30031
那么直接按着题意暴力解决就行了。。。。。
AC代码:
#include<stdio.h> #include<string.h> #include<math.h> /* pow函数说明 原型:extern float pow(float x, float y); 用法:#include <math.h> 功能:计算x的y次幂。 说明:x应大于零,返回幂指数的结果。 */ double p[110],e[110]; int Prime[35000],E[35000]; void IsPrime() { Prime[0] = Prime[1] = 0; for(int i = 2; i <= 35000; i++) { Prime[i] = 1; } for(int i = 2; i <= 35000; i++) { for(int j = i+i; j <= 35000; j+=i) { Prime[j] = 0; } } } int main() { int count,sign; IsPrime(); // for(int i = 2; i <= 35000; i++) // if(Prime[i]) // printf("%d ",i); while(1) { count = 0,sign = 0; memset(p,0,sizeof(p)); memset(e,0,sizeof(e)); memset(E,0,sizeof(E)); while(1) { scanf("%lf",&p[count]); if(p[count] == 0) { sign = 1; break; } scanf("%lf",&e[count]); count++; char c = getchar(); if(c=='\n') break; } if(sign == 1) break; double num = 1; for(int i = 0; i < count; i++) num *= pow(p[i],e[i]); int sum = (int)num - 1; // printf("%d\n",sum); int flag = 0,pos = 2; for(int i = 2; i <= 32767; i++) { if(sum == 1) break; if(Prime[i]) { while(sum % i == 0) { E[i]++; sum /= i; if(flag == 0) { flag = 1; pos = i; } } } } for(int i = 32767; i>= 2; i--) { if(E[i]!=0 && i!=pos) printf("%d %d ",i,E[i]); else if(E[i]!=0 && i==pos) { printf("%d %d\n",i,E[i]); break; } } } return 0; }