CF1928E题解
Modular Sequence
题解
发现
第一个等差数列可以直接枚举项数,后面的考虑预处理 dp,设
最后还要输出方案,记录一下转移时最后一项的项数即可,都是简单的。
代码:
/*
* @Author: operator_
* @Date: 2024-02-15 11:02:31
* @Last Modified by: operator_
* @Last Modified time: 2024-02-15 12:36:34
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd() {
int s=0,m=0;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch)) s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
}
int t,n,x,y,s,f[200005],g[200005];
signed main(){
cin>>t;
memset(f,0x3f,sizeof(f));f[0]=0;
for(int i=1;i<=200000;i++)
for(int j=1;(j-1)*j/2<=i;j++)
if(f[i-(j-1)*j/2]+j<f[i])
g[i]=j,f[i]=f[i-(j-1)*j/2]+j;
while(t--) {
n=rd(),x=rd(),y=rd(),s=rd();
s-=n*(x%y);int xx=x/y,fl=0;
if(s<0||s%y!=0) {puts("NO");continue;}
s/=y;
for(int i=1;i<=n&&(2*xx+i-1)*i/2<=s;i++) {
int now=s-(2*xx+i-1)*i/2;
if(f[now]+i<=n) {
puts("YES");
for(int j=1;j<=i;j++) printf("%lld ",x+j*y-y);
for(int j=1;j<=n-f[now]-i;j++) printf("%lld ",x%y);
while(now!=0) {
for(int j=1;j<=g[now];j++) printf("%lld ",x%y+j*y-y);
now-=(g[now]-1)*g[now]/2;
}
puts("");fl=1;break;
}
}
if(!fl) puts("NO");
}
return 0;
}
本文来自博客园,作者:operator,转载请注明原文链接:https://www.cnblogs.com/operator-/p/18016157 ♪(^∀^●)ノシ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】