如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1049

来自"NOCOW"

跳转到: 导航, 搜索

by cgangee http://www.cgang.tk

const maxn=10000;
 
var i,j,k,m,n,l:longint;
    a:array[1..maxn]of boolean;
    b:array[1..maxn]of longint;
    ans,now:longint;
 
begin
     i:=1;
     ans:=1;
     while i<=maxn do
     begin
          inc(i);
          while (i<=maxn)and a[i] do inc(i);
          if i>maxn then break;
          for j:=2 to maxn div i do a[j*i]:=true;
     end;
     for i:=1 to 10 do
     begin
          read(k);
          now:=0;
          for j:=2 to maxn do if not a[j] then
            while k mod j=0 do
            begin inc(b[j]); k:=k div j; end;
     end;
     for i:=2 to maxn do ans:=ans*(b[i]+1) mod 10;
     writeln(ans);
end.

VAR
  f:array [1..10000] of boolean;
  prime:array [1..1229] of longint;
  a:array [1..10000] of longint;
  i,j,k,n,sum,ans:longint;
BEGIN
  sum:=0;
    for i:=2 to 10000 do
      BEGIN
        if f[i]=false then
          BEGIN
            inc(sum);
            prime[sum]:=i;
          END;
        for j:=1 to sum do
          BEGIN
            if i*prime[j]>10000 then break;
            f[i*prime[j]]:=true;
            if i mod prime[j]=0 then break;
          END;
      END;
  k:=0;
    for i:=1 to 10 do
      BEGIN
        readln(n);
          for j:=1 to sum do
            while n mod prime[j]=0 do
              BEGIN
                n:=n div prime[j];
                inc(a[prime[j]]);
                  if j>k then k:=j;
              END;
      END;
  ans:=1;
    for i:=1 to k do ans:=ans*(a[prime[i]]+1);
  writeln(ans mod 10);
END.
//from lzoi_ys
解释一下
 
先来看求一个数a的约数个数。a=p1^b1+p2^b2+……pn^bn,其中p都是质数。那么它所有的约数都可以写成
 
p1^c1+p2^c2……+pn^cn{ci<=bi},这样每个ci都有bi+1种选择,而且由于都是质数所以不会有重复的。这样只要对
 
于每个数都分解质因数然后计数就可以了。
个人工具