【题意】数组矩阵

题意

给你一个长度为的数组,由构造出一个的矩阵,其中,问中有多少个子矩阵的和为

题解

考虑这个子矩阵的和为什么有:
若我们预处理出数组的前缀和那么上式就可以表示为:
由于的大小为,我们可以统计出所有的区间和的个数。然后再跑一遍每个区间的和,那么答案就是加上当前枚举的和的个数和的个数。
时还需特判一下。若,那么会使得的第行和第列的取值都是,一行会产生个满足条件的子矩阵,而第行和第列同时为的话,就会产生个子矩阵,不过需要注意一下,这个格子被计算了两次,所以需要减去。

复杂度

时间复杂度

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
long long cnt[N];
int sum[N];
int a[N];
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    for(int i=1; i<=n; i++)
        sum[i]=sum[i-1]+a[i];
    for(int i=1; i<=n; i++)
        for(int j=1; j<=i; j++)
            cnt[sum[i]-sum[j-1]]++;
    if(k==0)
    {
        printf("%lld\n",cnt[0]*n*(n+1)-cnt[0]*cnt[0]);
        return 0;
    }
    long long ans=0;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=i; j++)
        {
            int num=sum[i]-sum[j-1];
            if(num!=0&&k%num==0&&k/num<N)
                ans+=cnt[k/num];
        }
    printf("%lld\n",ans);
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
今天 12:23
点赞 评论 收藏
分享
fRank1e:吓得我不敢去外包了,但是目前也只有外包这一个实习,我还要继续去吗
点赞 评论 收藏
分享
06-12 16:00
天津大学 Java
牛客30236098...:腾讯坏事做尽,终面挂是最破防的 上次被挂了后我连简历都不刷了
点赞 评论 收藏
分享
哈哈哈哈哈哈哈哈哈哈这个世界太美好了
凉风落木楚山秋:毕业出路老师不管,你盖个章他好交差就完事了,等你盖完毕业了就不关他事情了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务