POJ 1365

题意:给出某数的质因数分解结果,求它减一后分解的质因数结果。

题解:模拟。

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 const int mr=40000;

 6 bool notp[mr];

 7 int pr[mr];

 8 int pn;

 9 void getpri()//筛素数

10 {

11     pn=0;

12     memset(notp,0,sizeof(notp));

13     for(int i=2; i<mr; i++)

14     {

15         if(!notp[i])

16         {

17             pr[pn++]=i;

18         }

19         for(int j=0; j<pn && i*pr[j]<mr; j++)

20         {

21             int k=i*pr[j];

22             notp[k]=1;

23             if(i%pr[j]==0)

24             {

25                 break;

26             }

27         }

28     }

29 }

30 int power(int a,int n)

31 {

32     if(n==0)

33         return 1;

34     else if(n==1)

35         return a;

36     else if(n&1)

37         return a*power(a*a,n>>1);

38     else

39         return power(a*a,n>>1);

40 }

41 char s[100000];

42 int main()

43 {

44     getpri();

45     while(gets(s))

46     {

47         if(s[0]=='0')

48             break;

49         int a,b,sum=1,i=0;

50         while(s[i]!='\0')

51         {

52             a=0,b=0;

53             while(s[i]!=' '&&s[i]!='\0')

54             {

55                 a=a*10+(s[i]-'0');

56                 i++;

57             }

58             i++;

59             while(s[i]!=' '&&s[i]!='\0')

60             {

61                 b=b*10+(s[i]-'0');

62                 i++;

63             }

64             sum*=power(a,b);

65             if(s[i]=='\0')

66                 break;

67             i++;

68         }

69         sum--;

70         int stk[40000][2],top=0;

71         for(int i=0;i<pn&&pr[i]<=sum;i++)

72         {

73             if(sum%pr[i]==0)

74             {

75                 b=0;

76                 a=pr[i];

77                 while(sum%a==0)

78                 {

79                     sum/=a;

80                     b++;

81                 }

82                 stk[top][0]=a;

83                 stk[top][1]=b;

84                 top++;

85             }

86         }

87         --top;

88         printf("%d %d",stk[top][0],stk[top][1]);

89         for(--top;top>=0;top--)

90         {

91             printf(" %d %d",stk[top][0],stk[top][1]);

92         }

93         printf("\n");

94     }

95     return 0;

96 }

你可能感兴趣的:(poj)