F:
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int ans[maxn];
bool flag[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(ans,0,sizeof(ans));
memset(flag,0,sizeof(flag));
int n;
scanf("%d",&n);
int cnt=0;
for(int i=1;i<=n;i+=2){
ans[i]=++cnt;
}
for(int i=2;i<=n;i+=2){
ans[i]=++cnt;
}
for(int i=1;i<=n;i++){
if(i!=n)
printf("%d ",ans[i]);
else
printf("%d\n",ans[i]);
}
}
return 0;
}
H:
转:https://www.cnblogs.com/stranger-/p/7819839.html
//先求和的质因子,枚举每个质因子X,并令每个元素对其取余,小的加在大的上面,
//算一下取余后的和是X的几倍,直到凑出这几个X为止。
//取一下余比我直接求和判断质数好多了,好菜,想不到。
#include<bits/stdc++.h>
using namespace std;
const int maxn= 1e5+5;
const int maxm= 1e6+5;
const int inf = 0x3f3f3f3f;
typedef long long ll;
ll su[maxm];
int a[maxn],b[maxn];
int cnt,n;
void sushu(ll x)
{
cnt=0;
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0)
su[cnt++]=i;
while(x%i==0)
x/=i;
}
su[cnt++]=x;
}
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ll sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sushu(sum);
ll maxx=99999999999;
for(int i=0;i<cnt;i++)
{
ll sum=0,cont=0;
for(int j=0;j<n;j++)
{
b[j]=a[j]%su[i];
sum+=b[j];
}
sort(b,b+n,cmp);
int k=0;
while(sum!=0&&k<n)
{
cont+=su[i]-b[k++];
sum-=su[i];
}
maxx=min(maxx,cont);
}
printf("%lld\n",maxx);
}
}