【构造】cf1129B-Wrong Answer

题意

对于一个长度为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;
}
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值