题目链接:
题目大意:
告诉你一个数的质因数x的全部底数pi和幂ei。输出x-1的质因数的全部底数和幂
解题思路:
这道题不难。可是题意特别不好理解。对于我这样的英文渣的人。愣是一个小时没看明确
关于题意举例说明吧
比如 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==' ') 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 ",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 ",i,E[i]); break; } } } return 0; }