17.8.18B组总结

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=283452;
即得:
ans=(8+1)(4+1)(2+1)=953=135 (指数相乘);
而对于(n!*(n!+1))这种大数的因子,其实只需求出1~n中的质因子,相加再乘二即可,又如样例: 1=1;2=2;3=3;4=22=22;5=5;6=23;
各数的指数相加得: 243251
乘二便得: 283452
记得要用高精度压位,压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;

一定要相信数据水……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值