洛谷P3941入阵曲

  题目传送门

  这道题也是今年湖南集训队Day8的第一题,昨天洛谷的公开赛上又考了一遍,来发个记录(其实是因为五月天,另外两道题分别是将军令和星空,出这次题目的人肯定同为五迷(✪㉨✪))

  话不多说。先理解下题意,给定一个n*m的矩阵,要求出能被k整除的子矩阵个数。

  题意很简单,但是矩阵这方面的题目一直是我最大的软肋,所以昨天做的时候就直接交了个O( n^2 m^2 )的暴力,然后运气还可以,水了60分(据说暴力只有55?)然后在网上看到某集训队大犇的解题报告,搞懂了这题的正解做法。

  那位大犇的做法是O( n^2 m )的,用读优可以卡过去,虽然我也想能不能还优化一下,但是无奈蒟蒻怎能比肩大犇QAQ

  为了优化时间复杂度,在读入的时候就用一个二维数组记录下前缀和(用融斥原理),之后n^2枚举纵列起点和终点,然后枚举横列,用两个数组计数,当然其中也还有一些非常玄学的做法,具体还是看代码吧,在代码里解释:

#include<bits/stdc++.h>
#define ll long long//切记要开long long;
#define maxn 405
using namespace std;
ll n,m,mod,a[maxn][maxn];
ll sum[maxn][maxn],ans;
ll b[maxn],cnt[1000010];
inline ll read()
{
  char ch=getchar();ll num=0;bool flag=false;
  while(ch<'0'||ch>'9'){if(ch=='-')flag=true;ch=getchar();}
//这里要注意要用while,一开始我用if被卡了四个点,非常玄学,可能是输入数据有毒; while(ch>='0'&&ch<='9'){num=num*10+ch-'0';ch=getchar();} return flag?-num:num; } int main() { //freopen("water.in","r",stdin); n=read();m=read();mod=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ a[i][j]=read(); sum[i][j]=(sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]); if(sum[i][j]>=mod)sum[i][j]-=mod;} //这里是一个小技巧,当sum已经大于mod时直接减去,可以缩小操作时的数据范围,对结果不影响,可以达到优化的效果; for(int i=0;i<n;++i){ for(int j=i+1;j<=n;++j){ cnt[0]=1;//别忘了初始化; for(int k=1;k<=m;++k){ b[k]=(sum[j][k]-sum[i][k])%mod; //这里自己好好理解下,为什么这么做可行;   if(b[k]<0)b[k]+=mod; ans+=cnt[b[k]]; ++cnt[b[k]]; } for(int k=1;k<=m;++k)cnt[b[k]]=0; //每次做完以后还原数组; } } printf("%lld\n",ans); return 0; }

  最后再放上炒鸡好听的入阵曲~~为我五团疯狂打call!!!!!

转载于:https://www.cnblogs.com/cytus/p/7776410.html

<think>嗯,用户问的是洛谷B3941的答案,我需要先确认一下这道题的具体内容。不过可能用户没有直接提供题目描述,所以得先回想或者查找相关题目。洛谷的题目编号B3941可能对应的是某个特定的编程问题,但作为通用知识库,我可能没有具体的题目信息。这时候,我需要告诉用户需要提供题目详情,或者尝试根据常见的B系列题目推测可能的题目类型。 常见的洛谷题目中,B开头的可能属于基础题或者比赛题目。比如B3941可能涉及数学、模拟或者算法基础。比如可能是一个数学问题,需要计算某个数列的和,或者处理字符串操作,或者是动态规划的问题。不过没有具体信息的话,很难给出准确的答案。 接下来,我需要引导用户提供更多的题目信息,比如题目描述、输输出样例等。同时,可以建议用户如何自行查找题解,比如在洛谷官网查看题目讨论区,或者使用搜索引擎查找题号加“题解”关键词。此外,提醒用户注意遵守洛谷的规定,不要直接索要答案,而是通过理解解题思路来学习。 另外,用户可能希望得到解题的思路而不是直接代码,所以需要强调独立思考的重要性,以及如何分解问题。例如,如果是算法题,可以分步骤讲解可能的解法,比如暴力法、优化方法,或者特定的算法技巧。如果是数学题,可能需要推导公式或者寻找规律。 同时,需要确保回答符合中国法律法规和学术诚信,不鼓励直接抄袭答案,而是提倡通过学习和练习来掌握解题方法。因此,在回答时,应该侧重于方法和思路的指导,而不是直接给出代码或答案。 总结来说,我需要用户提供更多题目细节才能有效帮助,同时给予一般性的解题建议,并引导正确学习方式。</think>由于您未提供洛谷题目B3941的具体内容,我无法直接给出答案或解析。以下是针对此类编程竞赛题目的通用解题建议: ### 如何自主解决洛谷题目? 1. **查看题目描述** 仔细阅读题目中的输输出格式、数据范围及样例,明确问题目标。 2. **分析核心算法** - 数学题:寻找公式规律(如数列求和、模运算性质) - 模拟题:按步骤实现操作流程 - 动态规划:设计状态转移方程 - 贪心算法:证明局部最优策略 3. **编写代码框架** ```python # 示例:处理多组输的通用结构 import sys for line in sys.stdin: n = int(line.strip()) # 核心逻辑 ``` 4. **测试边界条件** 测试极端情况(如n=0, 最大数据量)确保代码鲁棒性。 ### 获取题目帮助的合规途径 1. 访问洛谷本题**讨论区**查看题解(需登录) 2. 使用搜索引擎查询:`洛谷 B3941 题解 site:luogu.com.cn` 3. 在遵守社区规则的前提下,用伪代码描述您的思路并请求优化建议 ### 学术诚信提醒 直接获取他人代码会降低学习效果。建议先独立尝试实现,遇到具体错误时再针对性地分析问题,例如: - 超时:优化时间复杂度(如用快速幂代替暴力计算) - 错误答案:添加中间输出调试逻辑分支 如需进一步帮助,请补充题目具体描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值