ACM 2009. 6. 2. 21:11
반응형

There are two kinds of ways that I solve.
But both are not accepted from Judge Server because of Time Limit.

----------------------------------------------------------------------------------------------

#include <stdio.h>
#include <string.h>
#include <math.h>

#define MAX_NUM 65001
#define MIN_NUM 2

int carmichaelTable[MAX_NUM];

void precalculate(void);
int isCarMichaelFuc(int number);
unsigned long long myPow(int first, int second);

int main(void)
{
   
int i, inputNumber, isCarmichael;
   
long long result;

   
memset(carmichaelTable, 0, sizeof(carmichaelTable));

   
precalculate();

   
while(scanf("%d", &inputNumber) && inputNumber!=0)
   
{
       
if( !carmichaelTable[inputNumber] )
       
{
           
printf("%d is normal.\n", inputNumber);
       
}
       
else
       
{
           
printf("The number %d is a Carmichael number.\n", inputNumber);
       
}
   
}
   
return 0;
}

void precalculate(void)
{
   
int i, isCarmichael;
   
for(i=MIN_NUM; i<MAX_NUM; i++)
   
{
       
isCarmichael = 1;
       
isCarmichael = isCarMichaelFuc(i);
       
//printf("%d isCarmichael = %d\n", j, isCarmichael);
       
if( isCarmichael ) {
           
carmichaelTable[i] = 1;
           
//printf("%d is %d\n", i, carmichaelTable[i]);
       
}
   
}
}

int isCarMichaelFuc(int number)
{
   
int i, isCarmichael=1;
   
unsigned long long result;
   
for(i=MIN_NUM; i<number; i++)
   
{
       
result = myPow(i, number);
       
//printf("%d %d = %d\n", i, number, result);
       
if( result != i) {
           
isCarmichael = 0;
           
break;
       
}
   
}
   
return isCarmichael;
}

unsigned long long myPow(int first, int second)
{
   
int i;
   
unsigned long long result = first;
   
for(i=1; i<second; i++)
   
{
       
result *= first;
       
result %= second;
   
}
   
//printf("result = %llu\n", result);
   
return result;
}

 
 ----------------------------------------------------------------------------------------------
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <string.h>
#include <math.h>
 
#define MAX_NUM 65001 
#define MIN_NUM 2 
 
int isCarMichaelFuc(int number);
unsigned long long myPow(int first, int second);
 
int main(void)
{
    int i, inputNumber, isPrime, isCarmichael;
    long long result;
 
    while(scanf("%d", &inputNumber) && inputNumber!=0)
    {
        isPrime = 1;
        for(i=MIN_NUM; i<inputNumber; i++)
        {
            if( inputNumber%i == 0 )
            {
                isPrime = 0;
                break;
            }
        }
        if( !isPrime )
        {
            isCarmichael = isCarMichaelFuc(inputNumber);
            if( !isCarmichael )
            {
                printf("%d is normal.\n", inputNumber);
            }
            else
            {
                printf("The number %d is a Carmichael number.\n", inputNumber);
            }
        }
        else
            printf("%d is normal.\n", inputNumber);
    }
    return 0;
}
 
int isCarMichaelFuc(int number)
{
    int i, isCarmichael=1;
    unsigned long long result;
    for(i=MIN_NUM; i<number; i++)
    {
        result = myPow(i, number);
        if( result != i) {
            isCarmichael = 0;
            break;
        }
    }
    return isCarmichael;
}
 
unsigned long long myPow(int first, int second)
{
    int i;
    unsigned long long result = first;
    for(i=1; i<second; i++)
    {
        result *= first;
        result %= second;
    }
    return result;
}
반응형

'ACM' 카테고리의 다른 글

[Accept] 10018 Reverse and Add  (0) 2009.06.08
[10018] Reverse and Add  (0) 2009.06.03
[Accept] 10006 Carmichael Numbers  (0) 2009.06.02
[Accept] 10110 Light, more light  (0) 2009.06.02
[Accept] 850 Crypt Kicker II  (0) 2009.06.02
posted by ssuk1010
: