您的位置:首页 > 其它

【JZOJ4819】算循环

2016-10-15 15:03 239 查看

Description

给出一个n×m的矩阵,矩阵中每个格子的面积为1,求所有子矩阵的面积和。

Data Constraint



Solution

对于80分,我们可以发现一个公式:

ans=∑ni=1i(i+1)2⋅∑mi=1i(i+1)2

那么,我们现在要求1×2+2×3+⋯+n(n+1)。

显然i(i+1)=i2+i,那么上式就变成了:

∑i=1ni2+∑i=1ni=n(n+1)(2n+1)6+n(n+1)2。

然后就是O(1)算法了。

Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define mo 1000000007
#define ll long long
using namespace std;
ll pow(ll m,int n)
{
ll b=1;
while(n)
{
if(n%2) b=b*m%mo;
n/=2;
m=m*m%mo;
}
return b;
}
int main()
{
freopen("loop.in","r",stdin);
freopen("loop.out","w",stdout);
ll n,m;
cin>>n>>m;
n%=mo;
m%=mo;
ll t1=(n*(n+1)%mo*(2*n+1)%mo*pow(6,mo-2)+n*(n+1)%mo*pow(2,mo-2))%mo;
ll t2=(m*(m+1)%mo*(2*m+1)%mo*pow(6,mo-2)+m*(m+1)%mo*pow(2,mo-2))%mo;
ll ans=t1*t2%mo*pow(4,mo-2)%mo;
cout<<ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: