加赛2
加赛2
组题人: @LYinMX
\(T1\) P146. AA \(0pts\)
-
不会向量,贺的官方题解。
-
貌似最后的矩阵除法需要把分母求逆然后乘起来(题目某些限制条件给定了)。
\(T2\) P147. AB \(0pts\)
-
观察到 \(n^{m} \le 10^{6}\) ,即状态数不会超过 \(10^{6}\) 。
-
将长度为 \(m\) 的序列看做在 \(n\) 进制下长度为 \(m\) 的数(允许有前导零)。把前 \(m-1\) 一位作为节点,枚举下一位所填的位置后取后 \(m-1\) 位连边,然后跑欧拉路径即可。
-
需要特判当 \(n=1\) 时输出 \(m\) 个 \(0\) ,当 \(m=1\) 时顺序输出 \(0 \sim n-1\) 。
点击查看代码
int f[1000010],vis[10000010],id[10000010],cnt=0; vector<pair<int,int> >e[1000010]; stack<int>s; void dfs1(int pos,int sum,int n,int m) { if(pos==m-1) { cnt++; f[cnt]=sum; } else { for(int i=0;i<=n-1;i++) { dfs1(pos+1,sum*n+i,n,m); } } } void add(int u,int v,int id) { e[u].push_back(make_pair(v,id)); } void dfs2(int x) { for(int i=id[x];i<e[x].size();i=max(i+1,id[x])) { if(vis[e[x][i].second]==0) { vis[e[x][i].second]=1; id[x]=i+1; dfs2(e[x][i].first); } } s.push(x); } int main() { int n,m,p,sum=0,x,i,j; cin>>n>>m; if(m==1) { cout<<n<<endl; for(i=0;i<=n-1;i++) { cout<<i<<" "; } } else { if(n==1) { cout<<m<<endl; for(i=1;i<=m;i++) { cout<<0<<" "; } } else { dfs1(0,0,n,m); p=pow(n,m-2); for(i=1;i<=cnt;i++) { for(j=0;j<=n-1;j++) { sum++; add(i,lower_bound(f+1,f+1+cnt,(f[i]%p)*n+j)-f,sum); } } dfs2(1); cout<<s.size()-1<<endl; while(s.empty()==0) { x=s.top(); s.pop(); if(s.empty()==0) { cout<<f[s.top()]-(f[x]%p)*n<<" "; } } } } return 0; }
\(T3\) P148. AC \(100pts\)
-
感性理解
- 走过的空间 指 走过的位置 。
- 不知道在 \(n\) 维棋盘下的棋子移动方式。
-
每次走会减少 \(1\) 个可走的位置,故当 \(\prod\limits_{i=1}^{n}w_{i} \bmod 2=0\) 时先手必胜,否则后手必胜。
点击查看代码
int main() { ll t,n,ans,w,i,j; cin>>t; for(j=1;j<=t;j++) { cin>>n; ans=1; for(i=1;i<=n;i++) { cin>>w; ans=ans*w%2; } if(ans%2==0) { cout<<"xian"<<endl; } else { cout<<"hou"<<endl; } } return 0; }
-
官方题解称是多米诺骨牌覆盖,有一维是偶数则先手赢。
\(T4\) P149. AD \(0pts\)
- 赛时的
Special Judge
没有判单位球,构造 \(x_{j}-x_{i}\) 极大即可。 - 正解是模拟退火,或者乱搞过去。
总结
- 科普场。
- 高中文化课一点没学咋办。
后记
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18321574,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。