题目链接
Atcoder方向
Luogu方向
题目解法
首先考虑是否有可行的方案
从数列总和方向考虑
最终每个数相同,那么
s
u
m
sum
sum 一定是
n
n
n 的倍数
同时每次数列会加上
n
(
n
+
1
)
2
\frac{n(n+1)}{2}
2n(n+1)
考虑对
n
n
n 分奇偶考虑
- n为奇数,那么 n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1)一定是 n n n 的倍数,所以一开始数列的和 s s s 一定要为 n n n 的倍数
- n为偶数,
n
(
n
+
1
)
2
m
o
d
n
=
n
2
\frac{n(n+1)}{2} \bmod n=\frac{n}{2}
2n(n+1)modn=2n,所以
s
s
s 一定模
n
n
n 为
0
0
0 或
n
2
\frac{n}{2}
2n
同时当 s s s 为 n 2 \frac{n}{2} 2n 的倍数时,可以随机操作一次使 s s s 为 n n n 的倍数
现在考虑
s
s
s 为
n
n
n 的倍数时如何构造
考虑是否可以将
2
2
2 个数相对整个数列分别
+
1
+1
+1 和
−
1
-1
−1
构造方案:
2
,
1
,
3
,
.
.
.
,
n
2,\;\;\;\;1,\;\;\;\;\;\;3,...,\;\;\;n
2,1,3,...,n
n
,
n
−
1
,
n
−
2
,
.
.
.
,
1
n,n-1,n-2,...,1
n,n−1,n−2,...,1
第一个数加了
n
+
2
n+2
n+2,第二个数加了
n
n
n,其他数加了
n
+
1
n+1
n+1
并且进行了
2
2
2 次操作之后
s
s
s 仍为
n
n
n 的倍数
所以若干次之后一定可以将每个数都变为相同文章来源:https://www.toymoban.com/news/detail-559544.html
操作次数是 2 n a 2na 2na 级别的文章来源地址https://www.toymoban.com/news/detail-559544.html
#include <bits/stdc++.h>
using namespace std;
const int N(60),M(10100);
int n,ans,way[M][N];
pair<int,int> a[N];
inline int read(){
int FF=0,RR=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
return FF*RR;
}
int main(){
n=read();
int s=0;
for(int i=1;i<=n;i++) a[i]=make_pair(read(),i),s+=a[i].first;
if((n&1)&&(s%n)){ puts("No");exit(0);}//n为奇数,必须满足s是n的倍数
if((~n&1)&&(s%n!=0)&&(s%n!=n/2)){ puts("No");exit(0);}//n为偶数,必须满足s为0或n/2的倍数
if(s%n==n/2){
sort(a+1,a+n+1);ans++;
for(int i=1;i<=n;i++) way[ans][a[i].second]=n-i+1,a[i].first+=n-i+1;
}
while(true){
bool flg=1;
for(int i=2;i<=n;i++) if(a[i].first!=a[i-1].first){ flg=0;break;}
if(flg) break;
sort(a+1,a+n+1);ans++;
way[ans][a[1].second]=2,a[1].first+=2,way[ans][a[n].second]=1,a[n].first++;
for(int i=2;i<n;i++) way[ans][a[i].second]=i+1,a[i].first+=i+1;
ans++;
way[ans][a[1].second]=n,a[1].first+=n,way[ans][a[n].second]=n-1,a[n].first+=n-1;
for(int i=2;i<n;i++) way[ans][a[i].second]=n-i,a[i].first+=n-i;
}
puts("Yes");printf("%d\n",ans);
for(int i=1;i<=ans;i++){
for(int j=1;j<=n;j++) printf("%d ",way[i][j]);
puts("");
}
return 0;
}
到了这里,关于【Atcoder】 [ARC159C] Permutation Addition的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!