题意
对于一个长度为n的数组我们可以求出这样的一个值
然后题目中给出了一个函数计算这个值
显然这个得出不一定是正确答案
现在给你一个k(1<=k<=),让你构造出一个长度不超过2000的数组,按照上述函数计算出来的值与正确值相差k。数组内每个的元素的绝对值不超过
题解
题目中让我们构造出差值,这意味着我们可以同时增大错误答案和正确答案。
假如我们可以在构造出错误答案的情况下,构造出正确答案,且不影响原来的错误答案。
正确答案的定义为一段的区间和乘以长度。
我们可以划分出1500个位置给正确答案,这样我们的正确答案就是1500的倍数。
于是我们把错误答案设置到750000与900000之间,使得正确答案是150000的倍数。
那么我只需要后面1500个位置的和等于正确答案/1500就行了。
考虑一下正确答案的最大值为,除以1500,大概为,
所以我们就构造这样一个长度为2000的数组
错误答案 499个大负数 1498个0 -1 正确答案/1500+1
代码
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll k; int n=1000; const int inf=1e6; ll k1=1e5+5*1e4,k2; int n1; int a[2000]; ll sum,cnt; int main() { cin>>k; n1=k/k1; k2=(6+n1)*k1; k=k2-k; swap(k2,k); //cout<<k2<<" "<<k<<endl; cout<<2000<<endl; cout<<k2; for(int i=2;i<=500;i++){ cout<<' '<<-inf; } for(int i=1;i<=1498;i++)cout<<' '<<0; cout<<' '<<-1; cout<<' '<<k*100/k1+1<<endl; return 0; }