正题
题目大意
构造一个ai={1,−1}a_i=\{1,-1\}ai={1,−1}使得最小化∣∑i=1naii2∣|\sum_{i=1}^na_ii^2|∣i=1∑naii2∣
解题思路
我们发现有对于一段连续的x2−(x+1)2−(x+2)2+(x+3)2=4x^2-(x+1)^2-(x+2)^2+(x+3)^2=4x2−(x+1)2−(x+2)2+(x+3)2=4,那么就有x2−(x+1)2−(x+2)2+(x+3)2−(x+4)2+(x+5)2+(x+6)2−(x+7)2=0x^2-(x+1)^2-(x+2)^2+(x+3)^2-(x+4)^2+(x+5)^2+(x+6)^2-(x+7)^2=0x2−(x+1)2−(x+2)2+(x+3)2−(x+4)2+(x+5)2+(x+6)2−(x+7)2=0
那么我们对于连续888个就可以抵消掉,特判掉1∼51\sim 51∼5,然后预处理出6∼136\sim 136∼13的答案然后后面都按这么填取000即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int main()
{
// freopen("five.in","r",stdin);
// freopen("five.out","w",stdout);scanf("%d",&n);if(n==1)printf("1\n-1");else if(n==2)printf("3\n1 -1");else if(n==3)printf("4\n1 1 -1");else if(n==4)printf("2\n1 1 1 -1");else if(n==5)printf("3\n-1 1 1 1 -1");else{if(n%4==1||n%4==2)printf("1\n");else printf("0\n");if(n%8==6) printf("1 1 -1 1 1 -1"),n-=6;else if(n%8==7) printf("-1 -1 1 -1 1 1 -1"),n-=7;else if(n%8==0) printf("1 -1 -1 1 -1 1 1 -1"),n-=8;else if(n%8==1) printf("1 1 -1 -1 1 -1 1 1 -1"),n-=9;else if(n%8==2) printf("1 -1 -1 -1 1 1 1 -1 1 -1"),n-=10;else if(n%8==3) printf("-1 1 -1 -1 -1 1 1 1 -1 1 -1"),n-=11;else if(n%8==4) printf("-1 1 -1 -1 -1 1 -1 1 -1 1 1 -1"),n-=12;else if(n%8==5) printf("-1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 -1"),n-=13;for(;n;n-=8)printf(" 1 -1 -1 1 -1 1 1 -1"); }
}