Codeforces 1130 E.Wrong Answer 构造

题目要求构造一组数据使得题目给出代码的anwser和正确答案恰好相差k,我们记题目给出代码的输出为ans1,正确答案为ans2。

我们假设已经有总和为s的p个正数,使得此时的ans1=ans2=s*p,然后我们在左端添加一串长度为q,并且总和为-1的数,此时ans1=s*p,ans2=(s-1)*(p+q).

此时我们让ans2-ans1=k,于是我们推到得出s*(q-1)=k+p。

那么我们就可以通过枚举p,然后求k+p的因子,来判断是否存在合法方案。

显然p+q<=2000,并且由于p个数的总和应该达到k,所以p*1e6<=k ,然后另外的q个数和应该为-1,这个显然q为任意数都能构造出合法方案。

以下为具体代码。

#include<bits/stdc++.h>
using namespace std;
int i,i0,n,m;
int main()
{
    scanf("%d",&n);
    for(int p=1;p<=2000;p++)
    {
        for(i=1;i*i<=n+p;i++)
        {
            if((n+p)%i==0)
            {
                int q,k;
                q=i,k=(n+p)/q+1;
                if(q+p<=2000&&k<=(long long)1000000*p)
                {
                    printf("%d\n",p+q);
                    for(i=1;i<q;i++)printf("0 ");
                    printf("-1");
                    for(i=1;i<=p;i++)
                    {
                        if(k>=1000000)printf(" 1000000"),k-=1000000;
                        else printf(" %d",k),k=0;
                    }
                    return 0;
                }
                q=(n+p)/i,k=i+1;
                if(q+p<=2000&&k<=(long long)1000000*p)
                {
                    printf("%d\n",p+q);
                    for(i=1;i<q;i++)printf("0 ");
                    printf("-1");
                    for(i=1;i<=p;i++)
                    {
                        if(k>=1000000)printf(" 1000000"),k-=1000000;
                        else printf(" %d",k),k=0;
                    }
                    return 0;
                }
            }
        }
    }
    printf("-1\n");
    return 0;
}

 

posted @ 2019-02-27 19:00  BiteTheDDDDt  阅读(281)  评论(0编辑  收藏  举报