题目大意:给你一个N项数列的首项X,之后的每一项要么比前一项多A,要么少B,N项和为M,构造一个可行的数列
题解:设进行了x次+A,y次-B,易知在i+A对整体的影响为(n-i+1)*A,得到
x+y=12n(n−1)
Ax−By=M−n∗x
考虑贪心地构造答案,选择尽量大的数填满x。对于第i个数,如果n-i+1是构成x需要的,+A,反之-B
我的收获:构造大法~~~
#include<stdio.h>
#include<iostream>
using namespace std;
#define ll long long
ll n,X,A,B,M;
bool p[100005];
int main()
{
cin>>n>>X>>A>>B>>M;
ll s=0,tmp=M-n*X,y=(A*n*(n-1)/2-tmp)/(A+B),x=n*(n-1)/2-y;
cout<<X;
int now=n-1;
while(x)
{
if(x-now>=0) p[now]=1,x-=now;
now--;
}
for(int i=n-1;i>=1;i--)
{
if(p[i]) X+=A;else X-=B;
printf(" %lld",X);
}
return 0;
}