No1 最末非零位

问题描述

 给定一个数n,求出n!的最末非零位是多少。(n<=4220

输入文件

 一个数n(n<=4220)

输出文件

 一个数,n!的最末非零位

样例输入

11

样例输出

8

View Code
var
n,ans,now,sum1,sum2,i,num:longint;
begin
assign(input,'zero.in');
assign(output,'zero.out');
reset(input);
rewrite(output);
readln(n);
ans:=1;
for num:=1 to n do
begin
i:=num;
while i mod 5=0 do begin i:=i div 5; inc(sum2); end;
while i mod 2=0 do begin i:=i div 2; inc(sum1); end;
ans:=ans*i;
ans:=ans mod 10;
end;
while (sum1>0) and (sum2>0) do begin dec(sum1); dec(sum2); end;
while sum1>0 do
begin
ans:=ans*2;
dec(sum1);
ans:=ans mod 10;
end;
while sum2>0 do
begin
ans:=ans*5;
dec(sum2);
ans:=ans mod 10;
end;
writeln(ans mod 10);
close(input);
close(output);
end.


No2 happy number

问题描述

 一个人的一生呢,是由很多很多的阶段构成的,我们给每个人的每一天估出了一个happy number,我们规定一段时间的happiest num是这段时间内最小的happy number乘上这段时间happy number 的总和,现在给出一个人一段时间内每天的happy number,请你求出在哪段时间内他的happiest number最大,最大值为多少

输入文件

第一行为一个数n,表示给出的天数(1<=n<=100000

以下n行每行为一个数ai(0<=a<=1000000),表示第i天的happy number.

输出文件

第一行为最大的happiest number

第二行为可得到最大happiest number的时间段,即起始时间和终止时间,中间用一个空格隔开

样例输入

6

3

1

6

4

5

2

样例输出

60

3 5

第三天到第五天内最小的happy number4,这三天的happy number和为15,所以这三天的happiest number60

{
Spray
单调栈
巨棒
}
var
  a,sum:array[0..1000000] of int64;
  q,l,r:array[0..1000000] of longint;
  n,i,j,top,ansx,ansy:longint;
  temp,ans:int64;
begin
  assign(input,'number.in');reset(input);
  assign(output,'number.out');rewrite(output);
  read(n);
  for i:=1 to n do
    begin
      read(a[i]);
      sum[i]:=sum[i-1]+a[i];
    end;
  top:=1;
  for i:=1 to n+1 do
    begin
      while (a[q[top]]>a[i])and(top>0) do
        begin
          r[q[top]]:=i-1;
          dec(top);
        end;
      inc(top);
      q[top]:=i;
    end;
  for i:=n downto 0 do
    begin
      while (a[q[top]]>a[i])and(top>0) do
        begin
          l[q[top]]:=i+1;
          dec(top);
        end;
      inc(top);
      q[top]:=i;
    end;
  for i:=1 to n do
    begin
      temp:=(sum[r[i]]-sum[l[i]-1])*a[i];
      if (temp>ans) then
        begin
          ans:=temp;
		  ansx:=l[i];
		  ansy:=r[i];
        end;
    end;
  writeln(ans);
  writeln(ansx,' ',ansy);
  close(input);close(output);
end.

  

No3 硬币

问题描述

Leven枚硬币,还有一个神奇的小猪存钱罐,如果你放进去价值为m的硬币,它会吐出一张价值为m的纸币,但是呢,这个存钱罐最多只能放k枚硬币,有一天leve闲着无聊,便开始往里面放硬币,比方说,她有价值为13 的硬币,存钱罐最多只能放5枚硬币,然后,她可以得到价值为1,2,3,4,5,6,7,8,9,10,11,12,13的纸币,但是她不可能得到价值为14的纸币,然后,她又可以得到价值为15的纸币………..

于是,她想知道在给定硬币价值的前提下,得到的最大连续可得到的纸币的价值(也就是13

输入文件

1 行: 两个整数,K NK1 <= K <= 200)是可装的硬币总数。N1 <= N <= 50)是硬币的数量。

2 .. 文件末:N 个整数,每行 15 个,列出所有的 N 个硬币的价值,每个硬币的价值不超过 10000

输出文件

一个数,最大连续可得到的纸币的价值

样例输入

5 2

1 3

样例输出

13


const
  maxn=200000;
var
  k,n,ans,i:longint;
  a:array[1..100] of longint;
  sum,now,num:array[0..maxn] of longint;
  f:array[1..2000000] of 0..1;
procedure BFS;
var
  t,w,i:longint;
begin
  t:=0; w:=n;
  for i:=1 to n do
    begin
      sum[i]:=a[i];
      now[i]:=i;
      num[i]:=1;
      f[a[i]]:=1;
    end;
  while t<>w do
    begin
      t:=(t+1) mod maxn;
      if num[t]<k then
        for i:=now[t] to n do
          if f[sum[t]+a[i]]=0 then
            begin
              w:=(w+1) mod maxn; sum[w]:=sum[t]+a[i];
	      now[w]:=i; num[w]:=num[t]+1;
              f[sum[t]+a[i]]:=1;
            end;
    end;
  ans:=1;
  while f[ans]=1 do inc(ans);
  writeln(ans-1);
  close(input); close(output);
end;
begin
    assign(input,'coin.in'); reset(input);
    assign(output,'coin.out'); rewrite(output);
    readln(k,n);
    for i:=1 to n do read(a[i]);
    BFS;
end.

  

No4 木棍

问题描述

 n个小木棍,木棍的两端都被漆上了颜色,你可以将一端颜色相同的木棍连接在一起成为一根更长的木棍,如果你可以将这n根木棍连成一根木棍,输出‘Possible’,如果不能,输出‘Impossible’

输入文件

  第一行,一个整数n

  以下n行,每一行是每个木棍两端的颜色,用一个空格隔开

输出文件

  一行,‘Possible’或者‘Impossible’

样例输入

blue red

red violet

cyan blue

blue magenta

magenta cyan

样例输出

Possible

View Code
type
arr=array[0..27] of longint;
res=record
a:arr;
data:longint;
end;
var
tree:array[0..100000] of res;
i,j,tot:longint;
into:array[0..500000] of longint;
fa:array[0..500000] of longint;
s,st,en:string;
x,y,n,cnt:longint;
flag1,flag2:boolean;
function change(s:string):longint;
var
i,j,t,p,ans:longint;
begin
t:=1;
for i:=1 to length(s) do
begin
p:=ord(s[i])-ord('a');
if tree[t].a[p]<>-1 then
begin
t:=tree[t].a[p];
end else
begin
inc(tot);
tree[t].a[p]:=tot;
t:=tot;
end;
end;
if (tree[t].data<>-1) then exit(tree[t].data)
else begin
inc(n);
tree[t].data:=n;
exit(n);
end;
end;
function get(x:longint):longint;
begin
if (fa[x]=x) then exit(x);
fa[x]:=get(fa[x]);
exit(fa[x]);
end;
procedure union(x,y:longint);
var a,b:longint;
begin
a:=get(x);
b:=get(y);
if (a<>b) then fa[a]:=b;
end;
begin
assign(input,'color.in');reset(input);
assign(output,'color.out');rewrite(output);
fillchar(tree,sizeof(tree),255);
tot:=1;
for i:=1 to 500000 do fa[i]:=i;
while not eof do
begin
readln(s);
st:=copy(s,1,pos(' ',s)-1);
en:=copy(s,pos(' ',s)+1,length(s));
x:=change(st);
y:=change(en);
inc(into[x]);
inc(into[y]);
union(x,y);
end;
for i:=1 to n do
begin
if (into[i] and 1=1) then inc(cnt);
if i=1 then j:=get(i)
else if (j<>get(i)) then flag1:=true;
end;
if ((cnt<>0)and(cnt<>2))or(flag1) then
begin
writeln('Impossible');
end else writeln('Possible');
close(input);
close(output);
end.