POJ 1365 Prime Land【素数分解】【素数】【水題】

2602 ワード

タイトルリンク:
http://poj.org/problem?id=1365
テーマ:
数の素因数xのすべての底数piとべき乗eiを教えて、x-1の素因数のすべての底数とべき乗を出力します
問題解決の考え方:
この問題は難しくないが,問題の意味が特に理解しにくいので,私のような英語のクズの人には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; }