No1 最末非零位
问题描述
给定一个数n,求出n!的最末非零位是多少。(n<=4220)
输入文件
一个数n(n<=4220)
输出文件
一个数,n!的最末非零位
样例输入
11
样例输出
8
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 number为4,这三天的happy number和为15,所以这三天的happiest number为60)
{ 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 硬币
问题描述
Leve有n枚硬币,还有一个神奇的小猪存钱罐,如果你放进去价值为m的硬币,它会吐出一张价值为m的纸币,但是呢,这个存钱罐最多只能放k枚硬币,有一天leve闲着无聊,便开始往里面放硬币,比方说,她有价值为1和3 的硬币,存钱罐最多只能放5枚硬币,然后,她可以得到价值为1,2,3,4,5,6,7,8,9,10,11,12,13的纸币,但是她不可能得到价值为14的纸币,然后,她又可以得到价值为15的纸币………..
于是,她想知道在给定硬币价值的前提下,得到的最大连续可得到的纸币的价值(也就是13)
输入文件
第 1 行: 两个整数,K 和 N。K(1 <= K <= 200)是可装的硬币总数。N(1 <= 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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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.