80分求助,最后两个点RE,下载数据本机跑无异常
查看原帖
80分求助,最后两个点RE,下载数据本机跑无异常
186141
formkiller楼主2020/6/5 13:04
//good luck
# include <iostream>
# include <cstdio>
# include <cmath>
# include <cstdlib>
# include <cstring>
# include <string>
# include <algorithm>
# include <vector>
# include <queue>
# include <ctime>
# include <map>

#define LL long long
#define maxn int(1e6+5)
#define inf (int)1e9
#define is(a) (a>='0'&&a<='9')
#define iabs(a) ((a)>0?(a):(-a))
#define imax(a,b) ((a)>(b)?(a):(b))
#define imin(a,b) ((a)<(b)?(a):(b))

using namespace std;

LL N,M,n,a[maxn],sum[maxn];
LL f[maxn];

inline void read(LL &x)
{
  x=0;bool f=0;char ch=getchar();
  for (;!is(ch);ch=getchar()) f|=ch=='-';
  for (;is(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
  x=f?-x:x;
}

inline LL gcd(LL x,LL y){return x%y==0?y:gcd(y,x%y);}
inline void work(LL x)
{
	if (x == 1) 
	{
		for (int i = 1; i <= N; ++i) f[x] += a[i] * a[i];
		return;
	}
	if (x == 2) 
	{
		for (int i = 1; i <= N; i += 2) f[x] += a[i] * a[i+1] * 2;
		return;
	}
	for (int i = N; i >= 1; i -= x)
	{
		f[x] += sum[i-x+3] - sum[i+1] + a[i] * a[i-1] + a[i-x+1] * a[i-x+2];  
	}
}

int main()
{
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	read(N); read(M);
	for (int i = 1; i <= N; ++i) read(a[i]);
	sort(a+1,a+1+N);
	for (int i = N; i >= 3; --i) sum[i] = sum[i+1] + a[i] * a[i-2];
	n = sqrt(N);
	for (int i = 1; i <= n; ++i)
	{
		if (N % i == 0)	work(i);
		if (N / i != i) work(N/i);
	}
 	for (int i = 1; i <= M; ++i) 
	{
		LL x,k;
		read(x);
		k = N / gcd(x,N);
		printf("%lld\n",f[k]);
	}
	return 0;
}
2020/6/5 13:04
加载中...