JZOJ 4819 【NOIP2016提高A组模拟10.15】算循环

算循环

题目大意

n *m的矩阵的所有子矩阵面积之和。

数据范围

这里写图片描述

题解

首先考虑矩阵的横向长度,如果为i,那么有(m-i+1)的选择位置,则横向长度的总贡献为 mi=1 i*( m -i+ 1 ),同理,纵向长度的总贡献为ni=1i*( n -i+ 1 ),则答案为[mi=1i*( m -i+ 1 )] * [ni=1i*( n -i+ 1 )]。
那现在时间复杂度为n+ m 的,显然会超时。
Fn= ni=1 i*( n -i+ 1 ),则答案即为Fn * Fm
易得 Fn = Fn1 + n2 + n ,所以Fn= ni=1 ( i2 + i )=ni=1 i2 + ni=1 i

=n(n+1)(2n+1)6+ n(n+1)2

这样就可以O(1)求出答案了。(除法用逆元)

Code(Pascal)

const
    mo=1000000007;
var
    i,l:longint;
    ans,n,k,m,n2,n6:int64;
function ksm(o,k:int64):int64;
    begin
        ksm:=1;
        while k>0 do
        begin
            if k mod 2=1 then ksm:=ksm*o mod mo;
            o:=o*o mod mo;
            k:=k div 2;
        end;
    end;
begin
    readln(n,m);
    ans:=0;
    k:=0;
    n:=n mod mo;
    m:=m mod mo;
    n2:=ksm(2,mo-2);
    n6:=ksm(6,mo-2);
    k:=(n*(n+1) mod mo)*n2 mod mo;
    k:=k+((n*(n+1) mod mo)*(2*n+1) mod mo)*n6 mod mo;
    k:=k*n2 mod mo;
    ans:=(m*(m+1) mod mo)*n2 mod mo;
    ans:=ans+((m*(m+1) mod mo)*(2*m+1) mod mo)*n6 mod mo;
    ans:=ans*n2 mod mo;
    ans:=ans*k mod mo;
    writeln(ans);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值