博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SGU 499 Greatest Greatest Common Divisor
阅读量:7093 次
发布时间:2019-06-28

本文共 1245 字,大约阅读时间需要 4 分钟。

给定N个数,每两个数有一个最大公约数,求最大的最大公约数。N<=10^5,每个数<=10^6

枚举求是N^2*logN的,必定超时

换一个思考的角度,如果我们假设最大公约数是多少,用多少时间可以判定是否成立呢?

假设判定x,那么给变量每次加x,看有没有这个值,有的话就计数器加一,计数器一旦大于1,就成立,跳出即可。

这样,我们开一个10^6的数组,v[i]记录值为i的数的个数,判定有没有值时就是O(1)的了,总体时间在max_number*logN左右

View Code
1 program sgu499(input,output);  2 var  3    v     : array[0..1100000] of longint;  4    n,max : longint;  5 procedure init;  6 var  7    i,x : longint;  8 begin  9    fillchar(v,sizeof(v),0); 10    max:=0; 11    readln(n); 12    for i:=1 to n do 13    begin 14       readln(x); 15       inc(v[x]); 16       if x>max then 17      max:=x; 18    end; 19 end; {
init } 20 function check(x :longint ):boolean; 21 var 22 s,sum : longint; 23 begin 24 s:=0; 25 sum:=x; 26 while (sum<=max) do 27 begin 28 s:=s+v[sum]; 29 if s>1 then 30 begin 31 check:=true; 32 exit; 33 end; 34 sum:=sum+x; 35 end; 36 check:=false; 37 end; {
check } 38 procedure main; 39 var 40 i : longint; 41 begin 42 for i:=max downto 1 do 43 if check(i) then 44 begin 45 writeln(i); 46 break; 47 end; 48 end; {
main } 49 begin 50 init; 51 main; 52 end.

转载于:https://www.cnblogs.com/neverforget/archive/2012/03/09/2387769.html

你可能感兴趣的文章
[工具]查看一个网站是用什么语言编写的
查看>>
day4-RHCS
查看>>
.NET代码设计简单规范
查看>>
Microsoft.AspNet.SignalR实现弹幕(即时通讯)
查看>>
菜鸡互啄队 --- 第三周-需求改进&系统设计
查看>>
面向对象的多态
查看>>
配置Apache虚拟目录
查看>>
02.驱动调试
查看>>
C# 动态调用WebService
查看>>
在DataList控件访问子控件的方法
查看>>
EJB 连接DB util -- EntityManagerUtil
查看>>
oracle 创建用户指定表空间 删除用户删除表空间
查看>>
第十周作业
查看>>
Generate Parentheses(组合,回溯)
查看>>
ubuntu桌面进不去,我跪了
查看>>
UVALive - 6912 Prime Switch (状压DP)
查看>>
单元测试基础知识
查看>>
SQLServer数据库查看死锁、堵塞情况
查看>>
模拟window.onerror方法
查看>>
GitHub 上下载代码运行报错 :'The sandbox is not sync with the Podfile.lock\'
查看>>