24h購物| | PChome| 登入
2009-09-01 16:42:54| 人氣2,629| 回應2 | 上一篇 | 下一篇

ACM 10856 Q10856: Recover Factorial

推薦 0 收藏 0 轉貼0 訂閱站台

作法 : DP

注意 : N=0 時 請輸出 0! 這個答案 ※ 這讓我吃好多WA on UVA

程式碼 1 : 記憶體過大

程式碼 2 : 利用二分搜尋 來減少記憶體量 來加快速度

/***********************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int n;
short int num[2750001]={0};
int sum[2750001]={0};
int last[10000002]={0};
void Divisors ()
{
  int a,b;
  for (a=2;a<=2750000;a++)
     {
       sum[a]=sum[a-1];
       if(a%2==0||num[a]!=0)
        {
            if(a%2==0)
                 sum[a]+=(sum[a/2]-sum[a/2-1])+1;
            else
                 sum[a]+=(sum[a/num[a]]-sum[a/num[a]-1])+1;
        }
       else sum[a]++;
      
       if(sum[a]<=10000001&&last[sum[a]]==0)
          last[sum[a]]=a;
       else break;
     }
}
void prime()
{  
 int a,b;
 for(a=3;a<1658;a=a+2)     
      if(num[a]==0)     
        {     
           for(b=3;a*b<=2750000;b=b+2)     
             num[a*b]=a;      /*Here*/
        }  
}
main()
{
 prime();
 Divisors ();
 int time=0;
 while(1) time++;
 while(scanf("%d",&n)==1&&n>=0)
    {
     printf("Case %d: ",++time);
     if(n==0) {printf("0!\n");continue;}
     if(last[n]!=0)
     printf("%d!\n",last[n]);
     else printf("Not possible.\n");
    }
 return 0;
}

/*****************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int n;
short int num[2703665]={0};
int sum[2703664]={0};
void Divisors ()
{
  int a,b;
  for (a=2;a<=2703663;a++)
     {
       sum[a]=sum[a-1];
       if(a%2==0||num[a]!=0)
        {
            if(a%2==0)
                 sum[a]+=(sum[a/2]-sum[a/2-1])+1;
            else
                 sum[a]+=(sum[a/num[a]]-sum[a/num[a]-1])+1;
        }
       else sum[a]++;
     }
}
void prime()
{  
 int a,b;
 for(a=3;a<1644;a=a+2)     
      if(num[a]==0)     
        {     
           for(b=3;a*b<=2703664;b=b+2)     
             num[a*b]=a;      /*Here*/
        }  
}
int indexL(int n,int top)  
{  
 int lower=0, mid, high=top-1;  
 int index=-1;  
    do   /*二分搜尋*/ 
    {  
      mid=(lower+high)/2;  
      if(sum[mid]<n)      lower=mid+1;  
      else if(sum[mid]>n) high=mid-1;  
      else                index=mid;  
    }  
    while(index==-1&&lower<=high);  
  return index;
}
main()
{
 prime();
 Divisors ();
 int time=0;
 while(scanf("%d",&n)==1&&n>=0)
    {
     printf("Case %d: ",++time);
     if(n==0) {printf("0!\n");continue;}
     int find=indexL(n,2703664);
     if(find!=-1)
     printf("%d!\n",find);
     else printf("Not possible.\n");
    }
 return 0;
}

台長: 來源不明
人氣(2,629) | 回應(2)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ACM |
此分類下一篇:ACM 105 Q105: The Skyline Problem
此分類上一篇:ACM 332 Q332: Rational Numbers from Repeating Fractions

B88000005
0!的定義不是=1嗎??
怎麼會是0??
應該不可能有0這個答案!!
2009-09-01 23:16:06
B88000005
我知道了= =答案沒有錯...
1不是質數= =
2009-09-02 21:43:21
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文