[题解]ARC176 A~B
赛时心态崩了,0pts
遗憾离场……今天在学校冷静思考了下。发现B题思路其实很简单,不过A题怎么也没有想到,回来看了题解,其实思路也很简单,不过是自己思考方向错了。看来打比赛心态很重要,如果能冷静下来思考结果会好很多。
果然算法竞赛不能被常理所束缚(笑)
A - 01 Matrix Again
行列从\(0\)开始,以\((i+j)\ mod\ n\)的值给每个格子编号,就像这样:
我们发现任选其中\(m\)种编号的位置填上\(1\),得到的矩阵一定满足条件。那么具体在哪些编号上填\(1\)呢?
- 首先,输入给定的格子所在的编号一定要填。
- 其次,只按照第\(1\)条,可能凑不够\(m\)种,这种情况,就要在非输入给定的格子编号中任意挑选若干个,能凑成\(m\)种编号就行。
赛后一直思考这道题没有头绪是因为我的方向错了。当时我一直纠结于行和列的规律,却没有想到斜向考虑会如此简单。
点击查看代码
#include<bits/stdc++.h> using namespace std; int n,m; int main(){ cin>>n>>m; vector<bool> vis(n); for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; x--,y--; vis[(x+y)%n]=1; } vector<int> ans; for(int i=0;i<n;i++) if(vis[i]) ans.push_back(i); for(int i=0;i<n;i++) if(!vis[i]&&ans.size()<m) ans.push_back(i); cout<<n*m<<endl; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ int x=i,y=(ans[j]-i+n)%n; cout<<x+1<<" "<<y+1<<endl; } } return 0; }
B - Simple Math 4
显然的结论:
\(2^N\ mod\ (2^M-2^K)=2^{N-M+K}\ mod\ (2^M-2^K)\)。
所以循环直到\(N<M\)即可。这一步骤可以通过除法在\(O(1)\)的时间复杂度下解决。
接下来答案就是\(2^N\ mod\ 10\),根据\(N\ mod\ 4\)的结果有\(4\)种答案:\(2,4,8,6\),同样是\(O(1)\)。
但是需要注意的是得特判一种情况:n==m-1&&m-k==1
。这意味着原式等于\(2^N\ mod\ 2^{M-1}\)。而\(N=M-1\),所以这种情况需要输出\(0\)。
点击查看代码
#include<bits/stdc++.h> #define int long long using namespace std; int t,n,m,k; int mo[4]={6,2,4,8}; signed main(){ cin>>t; while(t--){ cin>>n>>m>>k; if(n>=m) n-=((n-m)/(m-k)+1)*(m-k); if(m-k==1&&n==m-1) cout<<"0\n"; else cout<<mo[n%4]<<"\n"; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效