ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

SGU_449 数论_最大公因数

http://acm.sgu.ru/problem.php?contest=0&problem=499

给定N(<10W)个数,在100W以内,求每两个数最大共因数中最大的。
直接枚举N^2超时,想到都在100W内,则可以以借助筛法来做。从上往下筛,最坏情况下是对于N*ln N<N*lgN。

#define maxn 100010
#define maxm 1000100

using namespace std;
int times[maxm];

int main()
{
    
int n;
    scanf(
"%d",&n);
    clr(times);
    
for (int i=0;i<n;i++)
    {
        
int x;
        scanf(
"%d",&x);
        times[x]
++;
    }
    
int i=1000000;
    
while (i>1)
    {
        
if (times[i]>1)
            
break;

        
int j=i+i;
        
int cnt=times[i];
        
while (j<=1000000 && cnt<2)
        {
            cnt
+=times[j];  //这里刚刚开始用的是times[i]+=times[j];这样不对,因为像 8这样的情况,会错的!
            j
+=i;
        }
        
if (cnt>1)
            
break;
        i
--;
    }
    printf(
"%d\n",i);
    
return 0;
}


posted on 2012-08-01 20:22 wangs 阅读(352) 评论(0)  编辑 收藏 引用 所属分类: ACM-数学


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理