17.8.18B组总结
又是愉快的一天,我也特别愉快地ak了。
以下是ak小结:
T1
先普及一下:
数量积
在数学中,数量积(dot product; scalarproduct,也称为点积)是接受在实数R上的两个向量并返回一个实数值标量的二元运算。它是欧几里得空间的标准内积。
两个向量a = [a1,a2,…, an]和b = [b1, b2,…, bn]的点积定义为: a*b=a1*b1+a2*b2+……+an*bn。
接着对于此题,只需排下序,a从大到小,b从小到大,一一相乘即可。
(对于证明,我也一直在想,甚至考试都花了半个小时证,然而有时候证明不了,它就是对的)。
T2
–:
又是无语的数论题,然而我却无法勇比当年,考试江郎才尽,没有推式子。
对于两个数(x,y),我们通过一波推式子得到:其实(x,y)的个数就是(n!*(n!+1))中因子的个数,就如样例:
(n!)2=518400=28∗34∗52;
即得:
ans=(8+1)∗(4+1)∗(2+1)=9∗5∗3=135
(指数相乘);
而对于(n!*(n!+1))这种大数的因子,其实只需求出1~n中的质因子,相加再乘二即可,又如样例:
1=1;2=2;3=3;4=2∗2=22;5=5;6=2∗3;
各数的指数相加得:
24,32,51
;
乘二便得:
28,34,52
。
记得要用高精度压位,压8位。
筛法求质因子(b为答案):
b[0]:=1;
b[1]:=1;
for i:=1 to n do
a[i]:=i;
sum:=1;
for i:=2 to n do
begin
if not bz[i] then
begin
inc(o);
p[o]:=i;
zhi:=2;
for j:=2 to n div i do
begin
bz[i*j]:=true;
while a[i*j] mod i=0 do
begin
inc(zhi,2);
a[i*j]:=a[i*j] div i;
end;
end;
if sum*(zhi+1)>=mo then
begin
cheng(sum);
sum:=1;
end;
sum:=sum*(zhi+1);
end;
end;
if sum<>1 then
cheng(sum);
T3
先吐槽下数据太水,随便的水法都55分。
考试的水法已经接近正解了,但没想到二分图匹配(没有删除)。正解是匈牙利算法(不是某WMZ说的宽搜),可以去看个比较有趣的博客
http://blog.csdn.net/dark_scope/article/details/8880547
本题做法类似,不过改成二维罢了;
大致二分图匹配过程:
function find(x,y:longint):boolean;
var
i,q,xx,yy,p:longint;
begin
for i:=1 to 4 do
begin
xx:=x+fx[i,1];
yy:=y+fx[i,2];
if (xx>0)and(yy>0)and(xx<=n)and(yy<=m)and(mark[xx,yy]=0) then//判断状态是否合法
begin
q:=link[xx,yy,1];//存原来的起始点
p:=link[xx,yy,2];
link[xx,yy,1]:=x;//改为此点
link[xx,yy,2]:=y;
mark[xx,yy]:=1;//标记为走过(记得每次清空)
if ((q=0)and(p=0))or(find(q,p)) then//判断是否可行
exit(true);
link[xx,yy,1]:=q;//没找到就改回原来的点
link[xx,yy,2]:=p;
end;
end;
exit(false);
end;
一定要相信数据水……